This commit is contained in:
ran.shang
2025-06-11 09:42:13 +08:00
commit 7e38b8d971
1935 changed files with 132836 additions and 0 deletions

View File

@@ -0,0 +1,40 @@
package com.newyetai.usercenter.notice.config;
import java.util.HashMap;
import java.util.Map;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import lombok.Data;
import lombok.NoArgsConstructor;
@ConfigurationProperties(prefix = "notice")
@Data
@Component
public class NoticeProperties {
private Map<String, WechatOffiaccountMsgProvider> wechatOffiaccountMsgs = new HashMap<>();
@Data
@NoArgsConstructor
public static class WechatOffiaccountMsgProvider {
/** 通知模版标识 **/
private String noticeTemplateCode;
/** 微信公众号消息模版id **/
private String templateId;
/** 微信公众号消息链接 **/
private String link;
}
public WechatOffiaccountMsgProvider getWechatOffiaccountProvider(String providerCode) {
return this.wechatOffiaccountMsgs.get(providerCode);
}
}

View File

@@ -0,0 +1,32 @@
package com.newyetai.usercenter.notice.constant;
/**
* 消息通道类型:
* @author sr on 2020-12-21
*/
public enum NoticeChannelTypeEnum {
/** 1站内信 **/
SITE(1),
/** 2短信 **/
SMS(2),
/** 3钉钉 **/
DING_TALK(3),
/** 4企业微信 **/
WORK_WECHAT(4),
/** 5邮件 **/
MAIL(5),
/** 6微信公众号 **/
WECHAT_OFFIACCOUNT(6);
NoticeChannelTypeEnum(Integer type) {
this.type = type;
}
private Integer type;
public Integer getType() {
return type;
}
}

View File

@@ -0,0 +1,8 @@
package com.newyetai.usercenter.notice.constant;
/**
* @author sr on 2020-12-20
*/
public interface NoticeContentTemplateConstants {
}

View File

@@ -0,0 +1,24 @@
package com.newyetai.usercenter.notice.constant;
/**
* 级别:
* @author sr on 2020-12-21
*/
public enum NoticeLevelEnum {
/** 1平台 **/
PLATFORM(1),
/** 2机构 **/
ORG(2);
NoticeLevelEnum(Integer type) {
this.type = type;
}
private Integer type;
public Integer getType() {
return type;
}
}

View File

@@ -0,0 +1,24 @@
package com.newyetai.usercenter.notice.constant;
/**
* 模块分类
* @author sr on 2020-12-21
*/
public enum NoticeModuleTypeEnum {
/** 1业务 **/
BIZ(1),
/** 2监控/预警 **/
ACTUATOR(2);
NoticeModuleTypeEnum(Integer type) {
this.type = type;
}
private Integer type;
public Integer getType() {
return type;
}
}

View File

@@ -0,0 +1,8 @@
package com.newyetai.usercenter.notice.constant;
/**
* @author sr on 2020-12-20
*/
public interface NoticeReceiverSettingConstants {
}

View File

@@ -0,0 +1,28 @@
package com.newyetai.usercenter.notice.constant;
/**
* 接收状态:
* @author sr on 2020-12-21
*/
public enum NoticeReceiverStatusEnum {
/** 1待发送 **/
INIT(1),
/** 2已发送 **/
SENT(2),
/** 3发送失败 **/
SEND_FAIL(3),
/** 4接收已读 **/
READ(4);
NoticeReceiverStatusEnum(Integer type) {
this.type = type;
}
private Integer type;
public Integer getType() {
return type;
}
}

View File

@@ -0,0 +1,26 @@
package com.newyetai.usercenter.notice.constant;
/**
* 接收人关联类型:
* @author sr on 2020-12-21
*/
public enum NoticeReceiverTypeEnum {
/** 1用户id **/
USER(1),
/** 2角色 **/
ROLE(2),
/** 3标准角色 **/
STANDARD_ROLE(3);
NoticeReceiverTypeEnum(Integer type) {
this.type = type;
}
private Integer type;
public Integer getType() {
return type;
}
}

View File

@@ -0,0 +1,25 @@
package com.newyetai.usercenter.notice.constant;
/**
* 接收状态:
* @author sr on 2020-12-21
*/
public enum NoticeSendStatusEnum {
/** 1待处理 **/
INIT(1),
/** 2已处理 **/
SENT(2);
NoticeSendStatusEnum(Integer type) {
this.type = type;
}
private Integer type;
public Integer getType() {
return type;
}
}

View File

@@ -0,0 +1,69 @@
package com.newyetai.usercenter.notice.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.newyetai.common.AlitaResult;
import com.newyetai.common.util.UserContextHolder;
import com.newyetai.common.validation.Update;
import com.newyetai.tkmybatis.pojo.Page;
import com.newyetai.usercenter.notice.dto.NoticeContentTemplateDTO;
import com.newyetai.usercenter.notice.dto.NoticeContentTemplateOperateDTO;
import com.newyetai.usercenter.notice.dto.NoticeContentTemplateQueryDTO;
import com.newyetai.usercenter.notice.service.NoticeContentTemplateService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
/**
* @author sr on 2020-12-20
*/
@RestController
@RequestMapping("notice_content_template")
@Api(tags = "通知消息体模版")
public class NoticeContentTemplateController{
@Autowired
private NoticeContentTemplateService noticeContentTemplateService;
@PostMapping("/create")
@ApiOperation("创建")
public AlitaResult<Long> create(
@Validated @RequestBody NoticeContentTemplateOperateDTO noticeContentTemplateOperateDTO){
UserContextHolder.checkPlatformOrg();
return AlitaResult.success(noticeContentTemplateService.create(noticeContentTemplateOperateDTO));
}
@PutMapping("/modify")
@ApiOperation("修改")
public AlitaResult<Boolean> modify(
@Validated(Update.class) @RequestBody NoticeContentTemplateOperateDTO noticeContentTemplateOperateDTO){
UserContextHolder.checkPlatformOrg();
noticeContentTemplateService.modify(noticeContentTemplateOperateDTO);
return AlitaResult.success(true);
}
@DeleteMapping("/remove/{id}")
@ApiOperation("删除")
public AlitaResult<Boolean> remove(@PathVariable Long id){
UserContextHolder.checkPlatformOrg();
noticeContentTemplateService.remove(id);
return AlitaResult.success(true);
}
@GetMapping("/page")
@ApiOperation("分页查询")
public AlitaResult<Page<NoticeContentTemplateDTO>> page(NoticeContentTemplateQueryDTO noticeContentTemplateQueryDTO){
noticeContentTemplateService.page(noticeContentTemplateQueryDTO);
return AlitaResult.success(noticeContentTemplateQueryDTO.getPageResult());
}
}

View File

@@ -0,0 +1,84 @@
package com.newyetai.usercenter.notice.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.newyetai.common.AlitaResult;
import com.newyetai.tkmybatis.pojo.Page;
import com.newyetai.usercenter.notice.dto.NoticeReceiverSettingDTO;
import com.newyetai.usercenter.notice.dto.NoticeReceiverSettingOperateDTO;
import com.newyetai.usercenter.notice.dto.NoticeReceiverSettingQueryDTO;
import com.newyetai.usercenter.notice.dto.NoticeReceiverSettingRemoveDTO;
import com.newyetai.usercenter.notice.dto.NoticeReceiverSettingRoleDTO;
import com.newyetai.usercenter.notice.dto.NoticeReceiverSettingUserDTO;
import com.newyetai.usercenter.notice.service.NoticeReceiverSettingService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
/**
* @author sr on 2020-12-20
*/
@RestController
@RequestMapping("notice_receiver_setting")
@Api(tags = "通知接收人设置")
public class NoticeReceiverSettingController{
@Autowired
private NoticeReceiverSettingService noticeReceiverSettingService;
@PostMapping("/create")
@ApiOperation("创建(新增)")
public AlitaResult<Boolean> create(
@Validated @RequestBody NoticeReceiverSettingOperateDTO noticeReceiverSettingOperateDTO) {
noticeReceiverSettingService.create(noticeReceiverSettingOperateDTO);
return AlitaResult.success(true);
}
@PostMapping("/save")
@ApiOperation("保存设置(内部判断新增/删除)")
public AlitaResult<Boolean> save(
@Validated @RequestBody NoticeReceiverSettingOperateDTO noticeReceiverSettingOperateDTO) {
noticeReceiverSettingService.save(noticeReceiverSettingOperateDTO);
return AlitaResult.success(true);
}
@DeleteMapping("/remove")
@ApiOperation("删除")
public AlitaResult<Boolean> remove(
@Validated @RequestBody NoticeReceiverSettingRemoveDTO noticeReceiverSettingRemoveDTO) {
noticeReceiverSettingService.remove(noticeReceiverSettingRemoveDTO);
return AlitaResult.success(true);
}
@GetMapping("/page")
@ApiOperation("分页查询")
public AlitaResult<Page<NoticeReceiverSettingDTO>> page(
NoticeReceiverSettingQueryDTO noticeReceiverSettingQueryDTO) {
noticeReceiverSettingService.list(noticeReceiverSettingQueryDTO);
return AlitaResult.success(noticeReceiverSettingQueryDTO.getPageResult());
}
@GetMapping("/page_user")
@ApiOperation("分页查询")
public AlitaResult<Page<NoticeReceiverSettingUserDTO>> pageUser(
@Validated NoticeReceiverSettingQueryDTO noticeReceiverSettingQueryDTO){
noticeReceiverSettingService.listUser(noticeReceiverSettingQueryDTO);
return AlitaResult.success(noticeReceiverSettingQueryDTO.getPageResult());
}
@GetMapping("/page_role")
@ApiOperation("分页查询")
public AlitaResult<Page<NoticeReceiverSettingRoleDTO>> pageRole(
@Validated NoticeReceiverSettingQueryDTO noticeReceiverSettingQueryDTO){
noticeReceiverSettingService.listRole(noticeReceiverSettingQueryDTO);
return AlitaResult.success(noticeReceiverSettingQueryDTO.getPageResult());
}
}

View File

@@ -0,0 +1,47 @@
package com.newyetai.usercenter.notice.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.newyetai.common.AlitaResult;
import com.newyetai.tkmybatis.pojo.Page;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordDTO;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordOperateDTO;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordQueryDTO;
import com.newyetai.usercenter.notice.service.NoticeSendRecordService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
/**
* @author sr on 2020-12-20
*/
@RestController
@RequestMapping("notice_send_record")
@Api(tags = "通知发送记录(内容模版级)")
public class NoticeSendRecordController {
@Autowired
private NoticeSendRecordService noticeSendRecordService;
@PostMapping("/create")
@ApiOperation("创建(发送通知)")
public AlitaResult<Boolean> create(
@Validated @RequestBody NoticeSendRecordOperateDTO noticeSendRecordOperateDTO){
noticeSendRecordService.create(noticeSendRecordOperateDTO);
return AlitaResult.success(true);
}
@GetMapping("/page")
@ApiOperation("分页查询")
public AlitaResult<Page<NoticeSendRecordDTO>> page(NoticeSendRecordQueryDTO noticeSendRecordQueryDTO){
noticeSendRecordService.page(noticeSendRecordQueryDTO);
return AlitaResult.success(noticeSendRecordQueryDTO.getPageResult());
}
}

View File

@@ -0,0 +1,64 @@
package com.newyetai.usercenter.notice.controller;
import com.newyetai.common.AlitaResult;
import com.newyetai.tkmybatis.pojo.Page;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordDetailDTO;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordDetailQueryDTO;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordDetailReqDTO;
import com.newyetai.usercenter.notice.service.NoticeSendRecordDetailService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* @author sr on 2020-12-20
*/
@RestController
@RequestMapping("notice_send_record_detail")
@Api(tags = "通知发送记录明细")
public class NoticeSendRecordDetailController {
@Autowired
private NoticeSendRecordDetailService noticeSendRecordDetailService;
@PostMapping("/page")
@ApiOperation("分页查询(当前登录人通知)")
public AlitaResult<Page<NoticeSendRecordDetailDTO>> page(@RequestBody
NoticeSendRecordDetailQueryDTO noticeSendRecordDetailQueryDTO) {
noticeSendRecordDetailQueryDTO.setUserId(noticeSendRecordDetailQueryDTO.getOperateUserId());
noticeSendRecordDetailService.list(noticeSendRecordDetailQueryDTO);
return AlitaResult.success(noticeSendRecordDetailQueryDTO.getPageResult());
}
@GetMapping("/detail")
@ApiOperation("单个明细查询")
public AlitaResult<NoticeSendRecordDetailDTO> detail(@Validated NoticeSendRecordDetailReqDTO reqDTO) {
return AlitaResult.success(noticeSendRecordDetailService.detail(reqDTO));
}
@PostMapping("/count")
@ApiOperation("消息数量查询(当前登录人通知)")
public AlitaResult<Integer> count(@RequestBody NoticeSendRecordDetailQueryDTO noticeSendRecordDetailQueryDTO) {
noticeSendRecordDetailQueryDTO.setUserId(noticeSendRecordDetailQueryDTO.getOperateUserId());
return AlitaResult.success(noticeSendRecordDetailService.count(noticeSendRecordDetailQueryDTO));
}
// 已读
@PostMapping("/read/{recordDetailId}")
@ApiOperation("已读通知")
public AlitaResult<Boolean> read(@PathVariable Long recordDetailId){
noticeSendRecordDetailService.read(recordDetailId);
return AlitaResult.success(true);
}
@PostMapping("/read_all")
@ApiOperation("已读通知")
public AlitaResult<Boolean> readAll(){
noticeSendRecordDetailService.readAll();
return AlitaResult.success(true);
}
}

View File

@@ -0,0 +1,75 @@
package com.newyetai.usercenter.notice.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.newyetai.common.AlitaResult;
import com.newyetai.common.util.UserContextHolder;
import com.newyetai.common.validation.Update;
import com.newyetai.tkmybatis.pojo.Page;
import com.newyetai.usercenter.notice.dto.NoticeTemplateDTO;
import com.newyetai.usercenter.notice.dto.NoticeTemplateOperateDTO;
import com.newyetai.usercenter.notice.dto.NoticeTemplateQueryDTO;
import com.newyetai.usercenter.notice.service.NoticeTemplateService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
/**
* @author sr on 2020-12-17
*/
@RestController
@RequestMapping("notice_template")
@Api(tags = "通知模版")
public class NoticeTemplateController{
@Autowired
private NoticeTemplateService noticeTemplateService;
@PostMapping("/create")
@ApiOperation("创建")
public AlitaResult<Long> create(
@Validated @RequestBody NoticeTemplateOperateDTO noticeTemplateOperateDTO) {
UserContextHolder.checkPlatformOrg();
return AlitaResult.success(noticeTemplateService.create(noticeTemplateOperateDTO));
}
@PutMapping("/modify")
@ApiOperation("修改")
public AlitaResult<Boolean> modify(
@Validated(Update.class) @RequestBody NoticeTemplateOperateDTO noticeTemplateOperateDTO) {
UserContextHolder.checkPlatformOrg();
noticeTemplateService.modify(noticeTemplateOperateDTO);
return AlitaResult.success(true);
}
@DeleteMapping("/remove/{id}")
@ApiOperation("删除")
public AlitaResult<Boolean> remove(@PathVariable Long id) {
UserContextHolder.checkPlatformOrg();
noticeTemplateService.remove(id);
return AlitaResult.success(true);
}
@GetMapping("/page")
@ApiOperation("分页查询")
public AlitaResult<Page<NoticeTemplateDTO>> page(NoticeTemplateQueryDTO noticeTemplateQueryDTO) {
noticeTemplateService.page(noticeTemplateQueryDTO);
return AlitaResult.success(noticeTemplateQueryDTO.getPageResult());
}
@GetMapping("/find/{id}")
@ApiOperation("单个查询")
public AlitaResult<NoticeTemplateDTO> find(@PathVariable Long id) {
return AlitaResult.success(noticeTemplateService.find(id));
}
}

View File

@@ -0,0 +1,29 @@
package com.newyetai.usercenter.notice.dao;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.newyetai.tkmybatis.mybatis.MyMapper;
import com.newyetai.usercenter.notice.dto.NoticeContentTemplateDTO;
import com.newyetai.usercenter.notice.dto.NoticeContentTemplateQueryDTO;
import com.newyetai.usercenter.notice.entity.NoticeContentTemplate;
/**
* 通知消息体模版
*
* @author sr on 2020-12-20
*/
public interface NoticeContentTemplateMapper extends MyMapper<NoticeContentTemplate> {
/**
* 查询
*
* @param noticeContentTemplateQueryDTO
* @return
* @author sr on 2020-12-20
*/
List<NoticeContentTemplateDTO> listNoticeContentTemplateDTO(
@Param("param") NoticeContentTemplateQueryDTO noticeContentTemplateQueryDTO);
}

View File

@@ -0,0 +1,110 @@
package com.newyetai.usercenter.notice.dao;
import java.util.List;
import java.util.Set;
import org.apache.ibatis.annotations.Param;
import com.newyetai.tkmybatis.mybatis.MyMapper;
import com.newyetai.usercenter.notice.dto.NoticeReceiverSettingDTO;
import com.newyetai.usercenter.notice.dto.NoticeReceiverSettingOperateDTO;
import com.newyetai.usercenter.notice.dto.NoticeReceiverSettingQueryDTO;
import com.newyetai.usercenter.notice.dto.NoticeReceiverSettingRemoveDTO;
import com.newyetai.usercenter.notice.dto.NoticeReceiverSettingRoleDTO;
import com.newyetai.usercenter.notice.dto.NoticeReceiverSettingUserDTO;
import com.newyetai.usercenter.notice.entity.NoticeReceiverSetting;
/**
* 通知接收人设置
*
* @author sr on 2020-12-20
*/
public interface NoticeReceiverSettingMapper extends MyMapper<NoticeReceiverSetting> {
/**
* 查询
*
* @param noticeReceiverSettingQueryDTO
* @return
* @author sr on 2020-12-20
*/
List<NoticeReceiverSettingDTO> listNoticeReceiverSettingDTO(
@Param("param") NoticeReceiverSettingQueryDTO noticeReceiverSettingQueryDTO);
/**
* 根据模版id删除接收人配置
*
* @param noticeReceiverSettingRemoveDTO
* @return
* @author sr on 2020-12-20
*/
int remove(@Param("param") NoticeReceiverSettingRemoveDTO noticeReceiverSettingRemoveDTO);
/**
* 查询操作机构接收人现有配置
*
* @param noticeReceiverSettingOperateDTO
* @return
* @author sr on 2020-12-20
*/
Set<Long> findReceiverUnionIds(
@Param("param") NoticeReceiverSettingOperateDTO noticeReceiverSettingOperateDTO);
/**
* 新增接收人配置
* @param noticeReceiverSettingOperateDTO
* @param receiverUnionIds
* @return
* @author sr on 2020-12-21
*/
int create(@Param("param") NoticeReceiverSettingOperateDTO noticeReceiverSettingOperateDTO,
@Param("receiverUnionIds") Set<Long> receiverUnionIds);
/**
* 根据关联id获取用户id
*
* @param orgId
* @param unionType
* @param unionIds
* @return
* @author sr on 2020-12-21
*/
Set<Long> findUserIdByUnionType(Long orgId, Integer unionType, Set<Long> unionIds);
/**
* 获取有效用户
*
* @return
* @author sr on 2020-12-21
*/
Set<Long> validUser(Long orgId, Set<Long> userIds);
/**
* 获取有效角色
* @param orgId
* @param roleIds
* @return
* @author sr on 2020-12-21
*/
Set<Long> validRole(Long orgId, Set<Long> roleIds);
/**
* 查询接收人-用户
*
* @param noticeReceiverSettingQueryDTO
* @return
* @author sr on 2021-01-07
*/
List<NoticeReceiverSettingUserDTO> listNoticeReceiverSettingUserDTO(
@Param("param") NoticeReceiverSettingQueryDTO noticeReceiverSettingQueryDTO);
/**
* 查询接收人-角色
*
* @param noticeReceiverSettingQueryDTO
* @return
* @author sr on 2021-01-07
*/
List<NoticeReceiverSettingRoleDTO> listNoticeReceiverSettingRoleDTO(
@Param("param") NoticeReceiverSettingQueryDTO noticeReceiverSettingQueryDTO);
}

View File

@@ -0,0 +1,55 @@
package com.newyetai.usercenter.notice.dao;
import com.newyetai.tkmybatis.mybatis.MyMapper;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordDetailDTO;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordDetailQueryDTO;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordDetailReqDTO;
import com.newyetai.usercenter.notice.dto.RecordDetailUpdateStatusDTO;
import com.newyetai.usercenter.notice.entity.NoticeSendRecordDetail;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 通知发送记录明细(接收人)
*
* @author sr on 2020-12-20
*/
public interface NoticeSendRecordDetailMapper extends MyMapper<NoticeSendRecordDetail> {
/**
* 查询
*
* @param noticeSendRecordDetailQueryDTO
* @return
* @author sr on 2020-12-20
*/
List<NoticeSendRecordDetailDTO> listNoticeSendRecordDetailDTO(
@Param("param") NoticeSendRecordDetailQueryDTO noticeSendRecordDetailQueryDTO);
/**
* @param noticeSendRecordDetails
* @param operateUserId
* @author sr on 2020-12-21
*/
void createDetails(@Param("entities") List<NoticeSendRecordDetail> noticeSendRecordDetails,
@Param("operateUserId") Long operateUserId);
int modifyStatus(@Param("param") RecordDetailUpdateStatusDTO recordDetailUpdateStatusDTO);
/**
* 详细通知发送记录数
*
* @param noticeSendRecordDetailQueryDTO 通知发送记录详细查询dto
* @return {@link Integer}
*/
Integer countNoticeSendRecordDetail(@Param("param") NoticeSendRecordDetailQueryDTO noticeSendRecordDetailQueryDTO);
/**
* 查询消息详情
*
* @param reqDTO 通知发送记录详细查询dto
* @return {@link NoticeSendRecordDetailDTO}
*/
NoticeSendRecordDetailDTO findNoticeSendRecordDetailDTO(@Param("param") NoticeSendRecordDetailReqDTO reqDTO);
}

View File

@@ -0,0 +1,38 @@
package com.newyetai.usercenter.notice.dao;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.newyetai.tkmybatis.mybatis.MyMapper;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordDTO;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordModifyDTO;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordQueryDTO;
import com.newyetai.usercenter.notice.entity.NoticeSendRecord;
/**
* 通知发送记录(内容模版级)
*
* @author sr on 2020-12-20
*/
public interface NoticeSendRecordMapper extends MyMapper<NoticeSendRecord> {
/**
* 查询
*
* @param noticeSendRecordQueryDTO
* @return
* @author sr on 2020-12-20
*/
List<NoticeSendRecordDTO> listNoticeSendRecordDTO(@Param("param") NoticeSendRecordQueryDTO noticeSendRecordQueryDTO);
/**
* 修改
*
* @param noticeSendRecordModifyDTO
* @return
* @author sr on 2021-02-08
*/
int modify(@Param("param")NoticeSendRecordModifyDTO noticeSendRecordModifyDTO);
}

View File

@@ -0,0 +1,29 @@
package com.newyetai.usercenter.notice.dao;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.newyetai.tkmybatis.mybatis.MyMapper;
import com.newyetai.usercenter.notice.dto.NoticeTemplateDTO;
import com.newyetai.usercenter.notice.dto.NoticeTemplateQueryDTO;
import com.newyetai.usercenter.notice.entity.NoticeTemplate;
/**
* 通知模版
*
* @author sr on 2020-12-17
*/
public interface NoticeTemplateMapper extends MyMapper<NoticeTemplate> {
/**
* 查询
*
* @param noticeTemplateQueryDto
* @return
* @author sr on 2020-12-17
*/
List<NoticeTemplateDTO> listNoticeTemplateDTO(
@Param("param") NoticeTemplateQueryDTO noticeTemplateQueryDTO);
}

View File

@@ -0,0 +1,43 @@
package com.newyetai.usercenter.notice.dto;
import java.io.Serializable;
import com.newyetai.common.dto.BaseDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
* @author sr on 2020-12-17
*/
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@SuperBuilder
@Data
@ApiModel(description = "通知消息体模版")
public class NoticeContentTemplateDTO extends BaseDTO implements Serializable{
/** **/
private static final long serialVersionUID = 1L;
@ApiModelProperty("通知模版id")
private Long templateId ;
@ApiModelProperty("消息通道类型:1站内信,2短信,3钉钉,4企业微信,5邮件(见notice_channel_type)")
private Integer channelType ;
@ApiModelProperty("标题")
private String title;
@ApiModelProperty("内容模版")
private String contentTemplate ;
@ApiModelProperty("是否启用")
private Boolean enabled;
@ApiModelProperty("链接")
private String link;
}

View File

@@ -0,0 +1,53 @@
package com.newyetai.usercenter.notice.dto;
import java.io.Serializable;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import com.newyetai.common.dto.BaseOperateDTO;
import com.newyetai.common.validation.Update;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* @author sr on 2020-12-20
*/
@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ApiModel(description = "通知消息体模版")
public class NoticeContentTemplateOperateDTO extends BaseOperateDTO implements Serializable{
/** **/
private static final long serialVersionUID = 1L;
@ApiModelProperty("id")
@NotNull(message = "id不能为空", groups = {Update.class})
private Long id;
@ApiModelProperty("通知模版id")
@NotNull(message = "通知模版id不能为空")
private Long templateId ;
@ApiModelProperty("消息通道类型:1站内信,2短信,3钉钉,4企业微信,5邮件(见notice_channel_type)")
@NotNull(message = "消息通道类型不能为空")
private Integer channelType ;
@ApiModelProperty("标题")
@NotBlank(message = "标题不能为空")
private String title;
@ApiModelProperty("内容模版")
@NotBlank(message = "内容模版不能为空")
private String contentTemplate ;
@ApiModelProperty("是否启用")
private Boolean enabled;
@ApiModelProperty("链接")
private String link;
}

View File

@@ -0,0 +1,40 @@
package com.newyetai.usercenter.notice.dto;
import java.io.Serializable;
import com.newyetai.common.dto.PageQueryDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* @author sr on 2020-12-17
*/
@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ApiModel(description = "通知消息体模版查询条件")
public class NoticeContentTemplateQueryDTO extends PageQueryDTO<NoticeContentTemplateDTO> implements Serializable{
/** **/
private static final long serialVersionUID = 1L;
@ApiModelProperty("id")
private Long id;
@ApiModelProperty("通知模版id")
private Long templateId ;
@ApiModelProperty("消息通道类型:1站内信,2短信,3钉钉,4企业微信,5邮件 等(见notice_channel_type)")
private Integer channelType ;
@ApiModelProperty("标题(模糊匹配)")
private String titleLike;
@ApiModelProperty("是否启用")
private Boolean enabled;
}

View File

@@ -0,0 +1,43 @@
package com.newyetai.usercenter.notice.dto;
import java.io.Serializable;
import com.newyetai.common.dto.BaseDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
* @author sr on 2020-12-17
*/
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@SuperBuilder
@Data
@ApiModel(description = "通知接收人设置")
public class NoticeReceiverSettingDTO extends BaseDTO implements Serializable{
/** **/
private static final long serialVersionUID = 1L;
@ApiModelProperty("通知模版id")
private Long templateId ;
@ApiModelProperty("机构id")
private Long orgId ;
@ApiModelProperty("接收人关联类型:1用户id,2角色,3标准角色(见notice_receiver_type)")
private Integer receiverUnionType ;
@ApiModelProperty("接收人关联id:用户id,角色id,标准角色id")
private Long receiverUnionId ;
@ApiModelProperty("接受人名称")
private String receiverName;
@ApiModelProperty("是否启用")
private Boolean enabled;
}

View File

@@ -0,0 +1,42 @@
package com.newyetai.usercenter.notice.dto;
import java.io.Serializable;
import java.util.Set;
import javax.validation.constraints.NotNull;
import com.newyetai.common.dto.BaseOperateDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* @author sr on 2020-12-20
*/
@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ApiModel(description = "通知接收人设置")
public class NoticeReceiverSettingOperateDTO extends BaseOperateDTO implements Serializable{
/** **/
private static final long serialVersionUID = 1L;
@ApiModelProperty("通知模版id")
@NotNull(message = "通知模版id不能为空")
private Long templateId ;
@ApiModelProperty("接收人关联类型:1用户id,2角色,3标准角色(见notice_receiver_type)")
@NotNull(message = "接收人关联类型不能为空")
private Integer receiverUnionType ;
@ApiModelProperty("接收人关联id:用户id,角色id,标准角色id")
@NotNull(message = "接收人关联id不能为空")
private Set<Long> receiverUnionIds ;
}

View File

@@ -0,0 +1,47 @@
package com.newyetai.usercenter.notice.dto;
import java.io.Serializable;
import javax.validation.constraints.NotNull;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import io.swagger.annotations.ApiModel;
import com.newyetai.common.dto.PageQueryDTO;
/**
* PageQueryDTO 范型 NoticeReceiverSettingDTO或其子类
*
* @author sr on 2020-12-17
*/
@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ApiModel(description = "通知接收人设置查询条件")
public class NoticeReceiverSettingQueryDTO extends PageQueryDTO implements Serializable{
/** **/
private static final long serialVersionUID = 1L;
@ApiModelProperty("id")
private Long id;
@ApiModelProperty("通知模版id")
@NotNull(message = "通知模版id不能为空")
private Long templateId ;
@ApiModelProperty("机构id")
private Long orgId ;
@ApiModelProperty("接收人关联类型:1用户id,2角色,3标准角色(见notice_receiver_type)")
private Integer receiverUnionType ;
public Long getOrgId() {
return orgId == null ? getOperateOrgId() : orgId;
}
}

View File

@@ -0,0 +1,50 @@
package com.newyetai.usercenter.notice.dto;
import java.io.Serializable;
import java.util.Set;
import javax.validation.constraints.NotNull;
import com.newyetai.common.dto.BaseOperateDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* @author sr on 2020-12-20
*/
@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "删除通知接收人")
public class NoticeReceiverSettingRemoveDTO extends BaseOperateDTO implements Serializable{
/** **/
private static final long serialVersionUID = -9143022441853162885L;
@ApiModelProperty("通知模版id")
@NotNull(message = "通知模版id不能为空")
private Long templateId ;
@ApiModelProperty("接收人关联类型:1用户id,2角色,3标准角色(见notice_receiver_type)")
@NotNull(message = "接收人关联类型不能为空")
private Integer receiverUnionType ;
@ApiModelProperty("接收人关联id:用户id,角色id,标准角色id")
private Set<Long> receiverUnionIds ;
@Builder
public NoticeReceiverSettingRemoveDTO(Long operateOrgId, Long operateUserId,
@NotNull(message = "通知模版id不能为空") Long templateId,
@NotNull(message = "接收人关联类型不能为空") Integer receiverUnionType, Set<Long> receiverUnionIds) {
super(operateOrgId, operateUserId);
this.templateId = templateId;
this.receiverUnionType = receiverUnionType;
this.receiverUnionIds = receiverUnionIds;
}
}

View File

@@ -0,0 +1,30 @@
package com.newyetai.usercenter.notice.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* @author sr on 2021-01-07
*/
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel(description = "通知接收人设置--用户")
public class NoticeReceiverSettingRoleDTO extends NoticeReceiverSettingDTO{
/** **/
private static final long serialVersionUID = 8752617190208418705L;
@ApiModelProperty("角色名称")
private String roleName;
@ApiModelProperty("是否启用")
private Boolean enabled;
@ApiModelProperty("标准角色")
private Integer standardType;
@ApiModelProperty("所属平台")
private Integer platformCode;
}

View File

@@ -0,0 +1,28 @@
package com.newyetai.usercenter.notice.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* @author sr on 2021-01-07
*/
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel(description = "通知接收人设置--用户")
public class NoticeReceiverSettingUserDTO extends NoticeReceiverSettingDTO{
/** **/
private static final long serialVersionUID = 8752617190208418705L;
@ApiModelProperty("账户名")
private String username;
@ApiModelProperty("中文名")
private String chineseName;
@ApiModelProperty("是否启用")
private Boolean enabled;
}

View File

@@ -0,0 +1,76 @@
package com.newyetai.usercenter.notice.dto;
import java.io.Serializable;
import java.util.Collections;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.newyetai.common.dto.BaseDTO;
import com.newyetai.common.util.JsonUtils;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
* @author sr on 2020-12-17
*/
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@SuperBuilder
@Data
@ApiModel(description = "通知发送记录(内容模版级)")
public class NoticeSendRecordDTO extends BaseDTO implements Serializable{
/** **/
private static final long serialVersionUID = 1L;
@ApiModelProperty("通知模版id")
private Long templateId ;
@ApiModelProperty("发送方机构id")
private Long senderOrgId ;
@ApiModelProperty("接收方机构id")
private Long receiverOrgId ;
@ApiModelProperty("消息体模版id")
private Long contentTemplateId ;
@ApiModelProperty("消息体参数")
private String contentParamData ;
@ApiModelProperty("消息体")
private String content ;
@ApiModelProperty("是否指定接收方(非预先设定)")
private Boolean appointed ;
@ApiModelProperty("状态:1待处理,2已处理(见notice_send_status)")
private Integer status ;
@ApiModelProperty("消息通道类型:1站内信,2短信,3钉钉,4企业微信,5邮件 等(见notice_channel_type)")
private Integer channelType ;
@ApiModelProperty("标题")
private String title;
@ApiModelProperty("内容模版")
private String contentTemplate ;
@ApiModelProperty("链接")
private String link;
@JsonIgnore
private Map<String, Object> contentParamDataMap;
public Map<String, Object> getContentParamDataMap(){
if (contentParamDataMap == null) {
if (StringUtils.isNotBlank(contentParamData)) {
contentParamDataMap = JsonUtils.toObject(this.getContentParamData(), Map.class);
} else {
contentParamDataMap = Collections.emptyMap();
}
}
return contentParamDataMap;
}
}

View File

@@ -0,0 +1,48 @@
package com.newyetai.usercenter.notice.dto;
import java.io.Serializable;
import com.newyetai.common.dto.BaseDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
* @author sr on 2020-12-17
*/
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@SuperBuilder
@Data
@ApiModel(description = "通知发送记录明细(接收人)")
public class NoticeSendRecordDetailDTO extends BaseDTO implements Serializable{
/** **/
private static final long serialVersionUID = 1L;
@ApiModelProperty("发送记录id")
private Long recordId ;
@ApiModelProperty("接收人id")
private Long userId ;
@ApiModelProperty("接收方帐号")
private String receiverAccountNo ;
@ApiModelProperty("接收状态:1待发送,2已发送,3发送失败,4接收已读(见notice_receiver_status)")
private Integer receiverStatus ;
@ApiModelProperty("通知模版code")
private String templateCode;
@ApiModelProperty("标题")
private String title;
@ApiModelProperty("链接")
private String link;
@ApiModelProperty("消息体")
private String content ;
}

View File

@@ -0,0 +1,35 @@
package com.newyetai.usercenter.notice.dto;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author sr on 2020-12-20
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ApiModel(description = "通知发送记录明细(接收人)")
public class NoticeSendRecordDetailOperateDTO implements Serializable{
/** **/
private static final long serialVersionUID = 1L;
@ApiModelProperty("发送记录id")
private Long recordId ;
@ApiModelProperty("接收人id")
private Long userId ;
@ApiModelProperty("接收方帐号")
private String receiverAccountNo ;
@ApiModelProperty("接收状态:1待发送,2已发送,3发送失败,4接收已读(见notice_receiver_status)")
private Integer receiverStatus ;
}

View File

@@ -0,0 +1,63 @@
package com.newyetai.usercenter.notice.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.newyetai.common.dto.PageQueryDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.util.Date;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
/**
* @author sr on 2020-12-17
*/
@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ApiModel(description = "通知发送记录明细(接收人)查询条件")
public class NoticeSendRecordDetailQueryDTO extends PageQueryDTO<NoticeSendRecordDetailDTO> implements Serializable{
/** **/
private static final long serialVersionUID = 1L;
@ApiModelProperty("id")
private Long id;
@ApiModelProperty("发送记录id")
private Long recordId ;
@ApiModelProperty("通知模版id")
private Long templateId ;
// 或模版code
@ApiModelProperty("通知模版code")
private String templateCode;
@ApiModelProperty("消息通道类型:1站内信,2短信,3钉钉,4企业微信,5邮件(见notice_channel_type)")
private Integer channelType ;
@JsonIgnore
@ApiModelProperty("接收人id")
private Long userId ;
@ApiModelProperty("接收状态:1待发送,2已发送,3发送失败,4接收已读(见notice_receiver_status)")
private Integer receiverStatus ;
@ApiModelProperty("消息通知时间起")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(
shape = JsonFormat.Shape.STRING,
pattern = "yyyy-MM-dd HH:mm:ss",
timezone = "GMT+8"
)
private Date createTimeStart ;
@ApiModelProperty("消息通知时间止")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(
shape = JsonFormat.Shape.STRING,
pattern = "yyyy-MM-dd HH:mm:ss",
timezone = "GMT+8"
)
private Date createTimeEnd ;
}

View File

@@ -0,0 +1,43 @@
package com.newyetai.usercenter.notice.dto;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.newyetai.common.util.UserContextHolder;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Objects;
/**
* @author sr on 2020-12-17
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ApiModel(description = "通知发送记录明细(接收人)查询条件")
public class NoticeSendRecordDetailReqDTO implements Serializable{
private static final long serialVersionUID = -3715540940245404664L;
/** **/
@ApiModelProperty("id")
@NotNull(message = "消息ID不能为空")
private Long id;
@JsonIgnore
@ApiModelProperty("接收人id")
private Long userId ;
public Long getUserId() {
if (Objects.isNull(userId)){
userId = UserContextHolder.getExistLoginUserId();
}
return userId;
}
}

View File

@@ -0,0 +1,34 @@
package com.newyetai.usercenter.notice.dto;
import com.newyetai.common.dto.BaseOperateDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author sr on 2021-02-08
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ApiModel(description = "通知发送记录-修改")
public class NoticeSendRecordModifyDTO extends BaseOperateDTO{
/** **/
private static final long serialVersionUID = 1035598395983126645L;
@ApiModelProperty("id")
private Long id;
@ApiModelProperty("旧状态")
public Integer oldStatus;
@ApiModelProperty("新状态")
public Integer newStatus;
@ApiModelProperty("消息体")
private String content ;
}

View File

@@ -0,0 +1,62 @@
package com.newyetai.usercenter.notice.dto;
import java.io.Serializable;
import java.util.Map;
import java.util.Set;
import com.google.common.collect.Maps;
import com.newyetai.common.dto.BaseOperateDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Builder.Default;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* @author sr on 2020-12-20
*/
@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ApiModel(description = "通知发送记录(内容模版级)")
public class NoticeSendRecordOperateDTO extends BaseOperateDTO implements Serializable{
/** **/
private static final long serialVersionUID = 1L;
@ApiModelProperty("通知模版id")
private Long templateId ;
// 或模版code
@ApiModelProperty("通知模版code")
private String templateCode;
@ApiModelProperty("消息体模版id")
private Long contentTemplateId ;
// 或消息体通道类型
@ApiModelProperty("消息通道类型:1站内信,2短信,3钉钉,4企业微信,5邮件(见notice_channel_type)")
private Integer channelType ;
@ApiModelProperty("接收方机构id,不传平台模版取1,非平台模版取当前上下文机构id")
private Long receiverOrgId ;
@ApiModelProperty("消息体参数")
@Default
private Map<String, Object> contentParamDataMap = Maps.newHashMap();
@ApiModelProperty("指定接收人")
private Set<Long> receiverUserIds;
/** 定制,通道类型不能为空 **/
@ApiModelProperty("定制模版内容")
private Boolean customContent;
@ApiModelProperty("标题")
private String title;
@ApiModelProperty("内容模版")
private String contentTemplate ;
@ApiModelProperty("链接")
private String link;
}

View File

@@ -0,0 +1,44 @@
package com.newyetai.usercenter.notice.dto;
import java.io.Serializable;
import com.newyetai.common.dto.PageQueryDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* @author sr on 2020-12-17
*/
@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ApiModel(description = "通知发送记录(内容模版级)查询条件")
public class NoticeSendRecordQueryDTO extends PageQueryDTO<NoticeSendRecordDTO> implements Serializable{
/** **/
private static final long serialVersionUID = 1L;
@ApiModelProperty("id")
private Long id;
@ApiModelProperty("通知模版id")
private Long templateId ;
@ApiModelProperty("通知模版code")
private String templateCode;
@ApiModelProperty("发送方机构id")
private Long senderOrgId ;
@ApiModelProperty("消息通道类型:1站内信,2短信,3钉钉,4企业微信,5邮件(见notice_channel_type)")
private Integer channelType ;
@ApiModelProperty("接收人id")
private Long userId ;
@ApiModelProperty("状态:1待处理,2已处理(见notice_send_status)")
private Integer status ;
}

View File

@@ -0,0 +1,42 @@
package com.newyetai.usercenter.notice.dto;
import java.io.Serializable;
import com.newyetai.common.dto.BaseDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
* @author sr on 2020-12-17
*/
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@SuperBuilder
@Data
@ApiModel(description = "通知")
public class NoticeTemplateDTO extends BaseDTO implements Serializable{
/** **/
private static final long serialVersionUID = 1L;
@ApiModelProperty("通知模版code")
private String templateCode;
@ApiModelProperty("通知名称")
private String templateName ;
@ApiModelProperty("模块分类:1业务,2监控/预警(见notice_module_type)")
private Integer moduleType;
@ApiModelProperty("业务分类:")
private Integer bizType;
@ApiModelProperty("级别:1平台,2机构(见notice_level)")
private Integer level;
@ApiModelProperty("是否启用")
private Boolean enabled;
}

View File

@@ -0,0 +1,53 @@
package com.newyetai.usercenter.notice.dto;
import java.io.Serializable;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import com.newyetai.common.dto.BaseOperateDTO;
import com.newyetai.common.validation.Update;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* @author sr on 2020-12-17
*/
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(description = "通知")
public class NoticeTemplateOperateDTO extends BaseOperateDTO implements Serializable {
/** **/
private static final long serialVersionUID = 6246259217863925980L;
@ApiModelProperty("id")
@NotNull(message = "id不能为空", groups = {Update.class})
private Long id;
@ApiModelProperty("通知模版code")
@NotBlank(message = "模版标识不能为空")
private String templateCode;
@ApiModelProperty("通知名称")
@NotBlank(message = "模版名称不能为空")
private String templateName ;
@ApiModelProperty("模块分类:1业务,2监控/预警(见notice_module_type)")
@NotNull(message = "模块分类不能为空")
private Integer moduleType;
@ApiModelProperty("业务分类:")
private Integer bizType;
@ApiModelProperty("级别:1平台,2机构(见notice_level)")
@NotNull(message = "级别不能为空")
private Integer level;
@ApiModelProperty("是否启用")
private Boolean enabled;
}

View File

@@ -0,0 +1,41 @@
package com.newyetai.usercenter.notice.dto;
import com.newyetai.common.annotation.trimAndUpper.TrimAndUpper;
import com.newyetai.common.dto.PageQueryDTO;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import java.io.Serializable;
/**
* @author sr on 2020-12-17
*/
@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class NoticeTemplateQueryDTO extends PageQueryDTO<NoticeTemplateDTO> implements Serializable{
/** **/
private static final long serialVersionUID = 1L;
@ApiModelProperty("id")
private Long id;
@ApiModelProperty("通知模版code")
private String templateCode;
@ApiModelProperty("通知模版code(模糊匹配)")
@TrimAndUpper(TrimAndUpper.ExecuteType.TRIM)
private String templateCodeLike;
@ApiModelProperty("通知名称(模糊匹配)")
@TrimAndUpper(TrimAndUpper.ExecuteType.TRIM)
private String templateNameLike ;
@ApiModelProperty("模块分类:1业务,2监控/预警(见notice_module_type)")
private Integer moduleType;
@ApiModelProperty("级别:1平台,2机构(见notice_level)")
private Integer level;
@ApiModelProperty("是否启用")
private Boolean enabled;
}

View File

@@ -0,0 +1,48 @@
package com.newyetai.usercenter.notice.dto;
import java.io.Serializable;
import java.util.Set;
import javax.validation.constraints.NotEmpty;
import com.newyetai.common.dto.BaseOperateDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* @author sr on 2020-12-28
*/
@Data
@EqualsAndHashCode(callSuper = false)
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ApiModel("通知发送记录更新状态")
public class RecordDetailUpdateStatusDTO extends BaseOperateDTO implements Serializable {
/** **/
private static final long serialVersionUID = 2700111335512586751L;
@ApiModelProperty("旧状态")
@NotEmpty(message = "旧状态不能为空")
private Integer oldStatus;
@ApiModelProperty("新状态")
@NotEmpty(message = "新状态不能为空")
private Integer newStatus;
@ApiModelProperty("通知发送记录明细id")
private Long recordDetailId;
@ApiModelProperty("通知发送记录明细id集合")
private Set<Long> recordDetailIds;
@ApiModelProperty("通知发送记录id")
private Long recordId;
@ApiModelProperty("消息通道类型")
@NotEmpty(message = "消息通道类型不能为空")
private Integer channelType;
}

View File

@@ -0,0 +1,56 @@
package com.newyetai.usercenter.notice.entity;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableName;
import com.newyetai.common.entity.BaseEntity;
import com.newyetai.usercenter.notice.constant.NoticeChannelTypeEnum;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* 通知消息体模版
*
* @author sr on 2020-12-17
*/
@TableName("notice_content_template")
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Data
public class NoticeContentTemplate extends BaseEntity implements Serializable {
/** **/
private static final long serialVersionUID = 1L;
/** 通知模版id */
private Long templateId ;
/** {@link NoticeChannelTypeEnum} 消息通道类型:1站内信,2短信,3钉钉,4企业微信,5邮件 等(见notice_channel_type) */
private Integer channelType ;
/** 标题 **/
private String title;
/** 内容模版 */
private String contentTemplate ;
/** 是否启用 **/
private Boolean enabled;
/** 链接 **/
private String link;
@Builder
public NoticeContentTemplate(Long id, Boolean deleted, Long createBy, Date createTime,
Long updateBy, Date updateTime, Long proxyBy, Long templateId, Integer channelType,
String title, String contentTemplate, Boolean enabled, String link) {
super(id, deleted, createBy, createTime, updateBy, updateTime, proxyBy);
this.templateId = templateId;
this.channelType = channelType;
this.title = title;
this.contentTemplate = contentTemplate;
this.enabled = enabled;
this.link = link;
}
}

View File

@@ -0,0 +1,50 @@
package com.newyetai.usercenter.notice.entity;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableName;
import com.newyetai.common.entity.BaseEntity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* 通知接收人设置
*
* @author sr on 2020-12-17
*/
@TableName("notice_receiver_setting")
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Data
public class NoticeReceiverSetting extends BaseEntity implements Serializable {
/** **/
private static final long serialVersionUID = 1L;
/** 通知模版id */
private Long templateId ;
/** 机构id */
private Long orgId ;
/** 接收人关联类型:1用户id,2角色,3标准角色(见notice_receiver_type) */
private Integer receiverUnionType ;
/** 接收人关联id:用户id,角色id,标准角色id */
private Long receiverUnionId ;
@Builder
public NoticeReceiverSetting(Long id, Boolean deleted, Long createBy, Date createTime,
Long updateBy, Date updateTime, Long proxyBy, Long templateId, Long orgId,
Integer receiverUnionType, Long receiverUnionId) {
super(id, deleted, createBy, createTime, updateBy, updateTime, proxyBy);
this.templateId = templateId;
this.orgId = orgId;
this.receiverUnionType = receiverUnionType;
this.receiverUnionId = receiverUnionId;
}
}

View File

@@ -0,0 +1,56 @@
package com.newyetai.usercenter.notice.entity;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.TableName;
import com.newyetai.common.entity.BaseEntity;
import com.newyetai.usercenter.notice.constant.NoticeChannelTypeEnum;
import com.newyetai.usercenter.notice.constant.NoticeSendStatusEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* 通知发送记录(内容模版级)
*
* @author sr on 2020-12-17
*/
@TableName("notice_send_record")
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Data
public class NoticeSendRecord extends BaseEntity implements Serializable {
/** **/
private static final long serialVersionUID = 1L;
/** 通知模版id */
private Long templateId ;
/** 发送方机构id */
private Long senderOrgId ;
/** 接收方机构id */
private Long receiverOrgId ;
/** 消息体模版id */
private Long contentTemplateId ;
/** 消息体参数 */
private String contentParamData ;
/** 消息体 */
private String content ;
/** 是否指定接收方(非预先设定) **/
private Boolean appointed ;
/** {@link NoticeSendStatusEnum}状态:1待处理,2已处理(见notice_send_status) */
private Integer status ;
/** {@link NoticeChannelTypeEnum} 消息通道类型:1站内信,2短信,3钉钉,4企业微信,5邮件 等(见notice_channel_type) */
private Integer channelType ;
/** 标题 **/
private String title;
/** 内容模版 */
private String contentTemplate ;
/** 链接 **/
private String link;
}

View File

@@ -0,0 +1,51 @@
package com.newyetai.usercenter.notice.entity;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableName;
import com.newyetai.common.entity.BaseEntity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* 通知发送记录明细(接收人)
*
* @author sr on 2020-12-17
*/
@TableName("notice_send_record_detail")
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Builder
@Data
public class NoticeSendRecordDetail extends BaseEntity implements Serializable {
/** **/
private static final long serialVersionUID = 1L;
/** 发送记录id */
private Long recordId ;
/** 接收人id */
private Long userId ;
/** 接收方帐号 */
private String receiverAccountNo ;
/** 接收状态:1待发送,2已发送,3发送失败,4接收已读(见notice_receiver_status) */
private Integer receiverStatus ;
@Builder
public NoticeSendRecordDetail(Long id, Boolean deleted, Long createBy, Date createTime,
Long updateBy, Date updateTime, Long proxyBy, Long recordId, Long userId,
String receiverAccountNo, Integer receiverStatus) {
super(id, deleted, createBy, createTime, updateBy, updateTime, proxyBy);
this.recordId = recordId;
this.userId = userId;
this.receiverAccountNo = receiverAccountNo;
this.receiverStatus = receiverStatus;
}
}

View File

@@ -0,0 +1,57 @@
package com.newyetai.usercenter.notice.entity;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableName;
import com.newyetai.common.entity.BaseEntity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* 通知模版
*
* @author sr on 2020-12-17
*/
@TableName("notice_template")
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Data
public class NoticeTemplate extends BaseEntity implements Serializable {
/** **/
private static final long serialVersionUID = 1L;
/** 通知模版code */
private String templateCode ;
/** 通知名称 **/
private String templateName ;
/** 模块分类:1业务,2监控/预警(见notice_module_type) */
private Integer moduleType ;
/** 业务分类: */
private Integer bizType ;
/** 级别:1平台,2机构(见notice_level) */
private Integer level ;
/** 是否启用 **/
private Boolean enabled;
@Builder
public NoticeTemplate(Long id, Boolean deleted, Long createBy, Date createTime, Long updateBy,
Date updateTime, Long proxyBy, String templateCode, String templateName, Integer moduleType, Integer bizType,
Integer level, Boolean enabled) {
super(id, deleted, createBy, createTime, updateBy, updateTime, proxyBy);
this.templateCode = templateCode;
this.templateName = templateName;
this.moduleType = moduleType;
this.bizType = bizType;
this.level = level;
this.enabled = enabled;
}
}

View File

@@ -0,0 +1,29 @@
<?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.newyetai.usercenter.notice.dao.NoticeContentTemplateMapper">
<select id="listNoticeContentTemplateDTO" resultType="com.newyetai.usercenter.notice.dto.NoticeContentTemplateDTO">
select
*
from notice_content_template
where
deleted = 0
<if test='param.id != null'>
and id = #{param.id}
</if>
<if test="param.templateId != null">
and template_id = #{param.templateId}
</if>
<if test="param.channelType != null">
and channel_type = #{param.channelType}
</if>
<if test='param.titleLike != null and param.titleLike.trim() != ""'>
<bind name="titleLike" value="'%' + param.titleLike + '%'"/>
and title = #{titleLike}
</if>
<if test="param.enabled != null">
and enabled = #{param.enabled}
</if>
</select>
</mapper>

View File

@@ -0,0 +1,207 @@
<?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.newyetai.usercenter.notice.dao.NoticeReceiverSettingMapper">
<select id="listNoticeReceiverSettingDTO" resultType="com.newyetai.usercenter.notice.dto.NoticeReceiverSettingDTO">
(
SELECT
s.*,
u.username receiverName,
u.enabled
FROM
notice_receiver_setting s
LEFT JOIN uc_user u ON u.id = s.receiver_union_id
AND u.deleted = 0
WHERE
s.deleted = 0
AND s.receiver_union_type = 1
<if test='param.id != null'>
and s.id = #{param.id}
</if>
<if test="param.templateId != null">
and s.template_id = #{param.templateId}
</if>
<if test="param.orgId != null">
and s.org_id = #{param.orgId}
</if>
<if test="param.receiverUnionType != null">
and s.receiver_union_type = #{param.receiverUnionType}
</if>
ORDER BY
s.id DESC
)
UNION
(
SELECT
s.*,
r.NAME receiverName,
r.enabled
FROM
notice_receiver_setting s
LEFT JOIN xs_role r ON r.id = s.receiver_union_id
AND r.deleted = 0
WHERE
s.deleted = 0
AND s.receiver_union_type = 2
<if test='param.id != null'>
and s.id = #{param.id}
</if>
<if test="param.templateId != null">
and s.template_id = #{param.templateId}
</if>
<if test="param.orgId != null">
and s.org_id = #{param.orgId}
</if>
<if test="param.receiverUnionType != null">
and s.receiver_union_type = #{param.receiverUnionType}
</if>
ORDER BY
s.id DESC
)
</select>
<update id="remove">
update
notice_receiver_setting
set
deleted = 1,
update_time = now(),
update_by = #{param.operateUserId}
where
template_id = #{param.templateId}
and receiver_union_type = #{param.receiverUnionType}
and org_id = #{param.operateOrgId}
and deleted = 0
<if test="param.receiverUnionIds != null">
and receiver_union_id in
<foreach collection="param.receiverUnionIds" item="receiverUnionId" open="(" separator="," close=")">
#{receiverUnionId}
</foreach>
</if>
</update>
<select id="findReceiverUnionIds" resultType="long">
select
receiver_union_id
from notice_receiver_setting
where
deleted = 0
and template_id = #{param.templateId}
and receiver_union_type = #{param.receiverUnionType}
and org_id = #{param.operateOrgId}
</select>
<insert id="create">
insert into notice_receiver_setting
(
template_id,
org_id,
receiver_union_type,
receiver_union_id,
deleted,
create_by,
create_time
) values
<foreach collection="receiverUnionIds" item="receiverUnionId" separator="," >
(#{param.templateId},
#{param.operateOrgId},
#{param.receiverUnionType},
#{receiverUnionId},
0,
#{param.operateUserId},
now())
</foreach>
</insert>
<select id="findUserIdByUnionType" resultType="long">
select
distinct u.id
from uc_user u
inner join xs_role_allocation ra on ra.allocation_id = u.id and ra.allocation_type = 1
inner join xs_role r on r.id = ra.role_id
where
u.deleted = 0
and ra.deleted = 0
and r.deleted = 0
and r.org_id = #{orgId}
<!-- 机构内角色 -->
and r.type = 1
<if test="unionType == 2">
and r.id in
<foreach collection="unionIds" item="unionId" open="(" separator="," close=")">
#{unionId}
</foreach>
</if>
<if test="unionType == 3">
and r.standard_type in
<foreach collection="unionIds" item="unionId" open="(" separator="," close=")">
#{unionId}
</foreach>
</if>
</select>
<select id="validUser" resultType="long">
select
distinct u.id
from uc_org_user ou
inner join uc_user u on ou.user_id = u.id
where
ou.deleted = 0
and u.deleted = 0
and ou.org_id = #{orgId}
and u.id in
<foreach collection="userIds" item="userId" open="(" separator="," close=")">
#{userId}
</foreach>
</select>
<select id="validRole" resultType="long">
select
distinct id
from xs_role
where
deleted = 0
and type = 1
and org_id = #{orgId}
and id in
<foreach collection="roleIds" item="roleId" open="(" separator="," close=")">
#{roleId}
</foreach>
</select>
<select id="listNoticeReceiverSettingUserDTO" resultType="com.newyetai.usercenter.notice.dto.NoticeReceiverSettingUserDTO">
select
s.*,
u.username,
u.nickname chineseName,
u.enabled
from notice_receiver_setting s
inner join uc_user u on s.receiver_union_id = u.id
where
s.deleted = 0
and u.deleted = 0
and s.template_id = #{param.templateId}
and s.org_id = #{param.orgId}
and s.receiver_union_type = 1
</select>
<select id="listNoticeReceiverSettingRoleDTO" resultType="com.newyetai.usercenter.notice.dto.NoticeReceiverSettingRoleDTO">
select
s.*,
r.name roleName,
r.enabled,
r.standard_type,
r.platform_code
from notice_receiver_setting s
inner join xs_role r on s.receiver_union_id = r.id
where
s.deleted = 0
and r.deleted = 0
and s.template_id = #{param.templateId}
and s.org_id = #{param.orgId}
and s.receiver_union_type = 2
</select>
</mapper>

View File

@@ -0,0 +1,171 @@
<?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.newyetai.usercenter.notice.dao.NoticeSendRecordDetailMapper">
<select id="listNoticeSendRecordDetailDTO" resultType="com.newyetai.usercenter.notice.dto.NoticeSendRecordDetailDTO">
select
rd.*,
t.template_code,
ct.title,
ct.link,
r.content
from notice_send_record_detail rd
inner join notice_send_record r on r.id = rd.record_id
inner join notice_template t on t.id = r.template_id
left join notice_content_template ct on ct.id = r.content_template_id and ct.deleted = 0
where
rd.deleted = 0
and r.deleted = 0
and t.deleted = 0
<if test='param.id != null'>
and rd.id = #{param.id}
</if>
<if test="param.recordId != null">
and rd.record_id = #{param.recordId}
</if>
<if test="param.templateId != null">
and r.template_id = #{param.templateId}
</if>
<if test='param.templateCode != null and param.templateCode.trim() != ""'>
and t.template_code = #{param.templateCode}
</if>
<if test="param.channelType != null">
and ct.channel_type = #{param.channelType}
</if>
<if test="param.userId != null">
and rd.user_id = #{param.userId}
</if>
<if test="param.receiverStatus != null">
and rd.receiver_status = #{param.receiverStatus}
</if>
<if test="param.createTimeStart != null">
and rd.create_time &gt;= #{param.createTimeStart}
</if>
<if test="param.createTimeEnd != null">
and rd.create_time &lt;= #{param.createTimeEnd}
</if>
order by rd.id desc
</select>
<select id="countNoticeSendRecordDetail" resultType="java.lang.Integer">
select
count(*)
from notice_send_record_detail rd
inner join notice_send_record r on r.id = rd.record_id
inner join notice_template t on t.id = r.template_id
left join notice_content_template ct on ct.id = r.content_template_id and ct.deleted = 0
where
rd.deleted = 0
and r.deleted = 0
and t.deleted = 0
<if test='param.id != null'>
and rd.id = #{param.id}
</if>
<if test="param.recordId != null">
and rd.record_id = #{param.recordId}
</if>
<if test="param.templateId != null">
and r.template_id = #{param.templateId}
</if>
<if test='param.templateCode != null and param.templateCode.trim() != ""'>
and t.template_code = #{param.templateCode}
</if>
<if test="param.channelType != null">
and ct.channel_type = #{param.channelType}
</if>
<if test="param.userId != null">
and rd.user_id = #{param.userId}
</if>
<if test="param.receiverStatus != null">
and rd.receiver_status = #{param.receiverStatus}
</if>
<if test="param.createTimeStart != null">
and rd.create_time &gt;= #{param.createTimeStart}
</if>
<if test="param.createTimeEnd != null">
and rd.create_time &lt;= #{param.createTimeEnd}
</if>
</select>
<select id="findNoticeSendRecordDetailDTO"
resultType="com.newyetai.usercenter.notice.dto.NoticeSendRecordDetailDTO">
select
rd.*,
t.template_code,
ct.title,
ct.link,
r.content
from notice_send_record_detail rd
inner join notice_send_record r on r.id = rd.record_id
inner join notice_template t on t.id = r.template_id
left join notice_content_template ct on ct.id = r.content_template_id and ct.deleted = 0
where
rd.deleted = 0
and r.deleted = 0
and t.deleted = 0
<if test='param.id != null'>
and rd.id = #{param.id}
</if>
<if test="param.userId != null">
and rd.user_id = #{param.userId}
</if>
</select>
<insert id="createDetails" parameterType="com.newyetai.usercenter.notice.entity.NoticeSendRecordDetail" useGeneratedKeys="true" keyProperty="id">
insert into notice_send_record_detail
(
record_id,
user_id,
receiver_account_no,
receiver_status,
deleted,
create_by,
create_time
)
values
<foreach collection="entities" item="item" separator="," >
(#{item.recordId},
#{item.userId},
#{item.receiverAccountNo},
#{item.receiverStatus},
0,
#{operateUserId},
now())
</foreach>
</insert>
<update id="modifyStatus">
update notice_send_record_detail rd
set
rd.receiver_status = #{param.newStatus},
rd.update_by = #{param.operateUserId},
rd.update_time = now()
where
rd.receiver_status = #{param.oldStatus}
and rd.deleted = 0
<!-- 通道 -->
and exists (
select *
from notice_send_record r
where r.id = rd.record_id
and r.deleted = 0
and r.channel_type = #{param.channelType}
)
<!-- 已读只能本人读 -->
<if test="param.newStatus == 4">
and rd.user_id = #{param.operateUserId}
</if>
<if test="param.recordDetailId != null">
and rd.id = #{param.recordDetailId}
</if>
<if test="param.recordId != null">
and rd.record_id = #{param.param.recordId}
</if>
<if test="param.recordDetailIds != null">
and rd.id in
<foreach collection="param.recordDetailIds" item="detailId" open="(" separator="," close=")">
#{detailId}
</foreach>
</if>
</update>
</mapper>

View File

@@ -0,0 +1,58 @@
<?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.newyetai.usercenter.notice.dao.NoticeSendRecordMapper">
<select id="listNoticeSendRecordDTO" resultType="com.newyetai.usercenter.notice.dto.NoticeSendRecordDTO">
select
r.*
from notice_send_record r
inner join notice_template t on t.id = r.template_id
inner join notice_content_template ct on ct.id = r.content_template_id
where
r.deleted = 0
and t.deleted = 0
and ct.deleted = 0
<if test='param.id != null'>
and r.id = #{param.id}
</if>
<if test="param.templateId != null">
and r.template_id = #{param.templateId}
</if>
<if test='param.templateCode != null and param.templateCode.trim() != ""'>
and t.template_code = #{param.templateCode}
</if>
<if test="param.senderOrgId != null">
and r.sender_org_id = #{param.senderOrgId}
</if>
<if test="param.channelType != null">
and ct.channel_type = #{param.channelType}
</if>
<if test="param.userId != null">
and exists (
select 1
from notice_send_record_detail rd
where rd.deleted = 0
and rd.record_id = r.id
and rd.user_id = #{param.userId}
)
</if>
</select>
<update id="modify">
update
notice_send_record
<set>
status = #{param.newStatus},
update_by = #{param.operateUserId},
update_time = now(),
<if test='param.content != null and param.content.trim() != ""'>
content = #{param.content},
</if>
</set>
where
id = #{param.id}
and status = #{param.oldStatus}
and deleted = 0
</update>
</mapper>

View File

@@ -0,0 +1,37 @@
<?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.newyetai.usercenter.notice.dao.NoticeTemplateMapper">
<select id="listNoticeTemplateDTO" resultType="com.newyetai.usercenter.notice.dto.NoticeTemplateDTO">
select
*
from notice_template
where
deleted = 0
<if test='param.id != null'>
and id = #{param.id}
</if>
<if test='param.templateCodeLike != null and param.templateCodeLike.trim() != ""'>
<bind name="templateCodeLike" value="'%' + param.templateCodeLike + '%'"/>
and template_code like #{templateCodeLike}
</if>
<if test='param.templateCode != null and param.templateCode.trim() != ""'>
and template_code = #{param.templateCode}
</if>
<if test='param.templateNameLike != null and param.templateNameLike.trim() != ""'>
<bind name="templateNameLike" value="'%' + param.templateNameLike + '%'"/>
and template_name like #{templateNameLike}
</if>
<if test="param.moduleType != null">
and module_type = #{param.moduleType}
</if>
<if test="param.level != null">
and level = #{param.level}
</if>
<if test="param.enabled != null">
and enabled = #{param.enabled}
</if>
order by id desc
</select>
</mapper>

View File

@@ -0,0 +1,37 @@
package com.newyetai.usercenter.notice.mapstruct;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import com.newyetai.usercenter.notice.dto.NoticeContentTemplateDTO;
import com.newyetai.usercenter.notice.entity.NoticeContentTemplate;
import com.newyetai.usercenter.notice.dto.NoticeContentTemplateOperateDTO;
/**
* @author sr on 2020-12-20
*/
@Mapper
public interface NoticeContentTemplateMapMapper {
NoticeContentTemplateMapMapper INSTANCE =
Mappers.getMapper(NoticeContentTemplateMapMapper.class);
/**
* dto to entity
*
* @param noticeContentTemplateDto
* @return
* @author sr on 2020-12-20
*/
NoticeContentTemplate toEntity(
NoticeContentTemplateDTO noticeContentTemplateDto);
/**
* @param noticeContentTemplateOperateDTO
* @return
* @author sr on 2020-12-20
*/
NoticeContentTemplate toEntity(NoticeContentTemplateOperateDTO noticeContentTemplateOperateDTO);
}

View File

@@ -0,0 +1,45 @@
package com.newyetai.usercenter.notice.mapstruct;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import com.newyetai.usercenter.notice.dto.NoticeReceiverSettingDTO;
import com.newyetai.usercenter.notice.entity.NoticeReceiverSetting;
import com.newyetai.usercenter.notice.dto.NoticeReceiverSettingOperateDTO;
import com.newyetai.usercenter.notice.dto.NoticeReceiverSettingRemoveDTO;
/**
* @author sr on 2020-12-20
*/
@Mapper
public interface NoticeReceiverSettingMapMapper {
NoticeReceiverSettingMapMapper INSTANCE =
Mappers.getMapper(NoticeReceiverSettingMapMapper.class);
/**
* dto to entity
*
* @param noticeReceiverSettingDto
* @return
* @author sr on 2020-12-20
*/
NoticeReceiverSetting toEntity(
NoticeReceiverSettingDTO noticeReceiverSettingDto);
/**
* @param noticeReceiverSettingOperateDTO
* @return
* @author sr on 2020-12-20
*/
NoticeReceiverSetting toEntity(NoticeReceiverSettingOperateDTO noticeReceiverSettingOperateDTO);
/**
* @param noticeReceiverSettingOperateDTO
* @return
* @author sr on 2020-12-21
*/
NoticeReceiverSettingRemoveDTO toRemoveDTO(NoticeReceiverSettingOperateDTO noticeReceiverSettingOperateDTO);
}

View File

@@ -0,0 +1,29 @@
package com.newyetai.usercenter.notice.mapstruct;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordDetailDTO;
import com.newyetai.usercenter.notice.entity.NoticeSendRecordDetail;
/**
* @author sr on 2020-12-20
*/
@Mapper
public interface NoticeSendRecordDetailMapMapper {
NoticeSendRecordDetailMapMapper INSTANCE =
Mappers.getMapper(NoticeSendRecordDetailMapMapper.class);
/**
* dto to entity
*
* @param noticeSendRecordDetailDto
* @return
* @author sr on 2020-12-20
*/
NoticeSendRecordDetail toEntity(
NoticeSendRecordDetailDTO noticeSendRecordDetailDto);
}

View File

@@ -0,0 +1,36 @@
package com.newyetai.usercenter.notice.mapstruct;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import com.newyetai.usercenter.notice.dto.NoticeContentTemplateDTO;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordDTO;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordOperateDTO;
import com.newyetai.usercenter.notice.entity.NoticeSendRecord;
/**
* @author sr on 2020-12-20
*/
@Mapper
public interface NoticeSendRecordMapMapper {
NoticeSendRecordMapMapper INSTANCE =
Mappers.getMapper(NoticeSendRecordMapMapper.class);
/**
* dto to entity
*
* @param noticeSendRecordDto
* @return
* @author sr on 2020-12-20
*/
NoticeSendRecord toEntity(
NoticeSendRecordDTO noticeSendRecordDto);
NoticeSendRecordOperateDTO clone(NoticeSendRecordOperateDTO dto);
NoticeContentTemplateDTO toContentTemplate(NoticeSendRecordOperateDTO dto);
}

View File

@@ -0,0 +1,35 @@
package com.newyetai.usercenter.notice.mapstruct;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import com.newyetai.usercenter.notice.dto.NoticeTemplateDTO;
import com.newyetai.usercenter.notice.dto.NoticeTemplateOperateDTO;
import com.newyetai.usercenter.notice.entity.NoticeTemplate;
/**
* @author sr on 2020-12-17
*/
@Mapper
public interface NoticeTemplateMapMapper {
NoticeTemplateMapMapper INSTANCE =
Mappers.getMapper(NoticeTemplateMapMapper.class);
/**
* dto to entity
*
* @param noticeTemplateDto
* @return
* @author sr on 2020-12-17
*/
NoticeTemplate toEntity(NoticeTemplateDTO noticeTemplateDto);
/**
* @param noticeTemplateOperateDTO
* @return
* @author sr on 2020-12-17
*/
NoticeTemplate toEntity(NoticeTemplateOperateDTO noticeTemplateOperateDTO);
}

View File

@@ -0,0 +1,75 @@
package com.newyetai.usercenter.notice.service;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.newyetai.common.AlitaResult;
import com.newyetai.common.freemarker.util.FreeMarkerTemplateUtils;
import com.newyetai.mq.consumer.handler.ITopicMqHandler;
import com.newyetai.mq.dto.TopicMqMessage;
import com.newyetai.mq.util.MqSendUtils;
import com.newyetai.security.util.MockUtils;
import com.newyetai.usercenter.notice.constant.NoticeChannelTypeEnum;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordDTO;
import com.newyetai.usercenter.notice.util.NoticeSendRecordUtils;
import com.newyetai.usercenter.userprod.constant.UcMqSelfConstants;
public interface INoticeChannelProvider extends ITopicMqHandler<NoticeSendRecordDTO>{
Logger LOGGER = LoggerFactory.getLogger(INoticeChannelProvider.class);
/**
*
* @return {@link NoticeChannelTypeEnum}
* @author sr on 2021-01-04
*/
Integer getChannelType();
default String format(String contentTemplate, Map<String, Object> contentParamDataMap) {
return FreeMarkerTemplateUtils.formatString(contentTemplate, contentParamDataMap);
}
/**
* 发送(保存发送记录+明细+处理真实通道消息发送)
*
* @param noticeSendRecordDTO
* @author sr on 2021-02-19
*/
void send(NoticeSendRecordDTO noticeSendRecordDTO);
/**
* 异步,发送mq
*
* @param noticeSendRecordDTO
* @return
* @author sr on 2021-02-19
*/
default AlitaResult<?> asyncDeal(NoticeSendRecordDTO noticeSendRecordDTO) {
return MqSendUtils.send(
getRoutingKey(),
noticeSendRecordDTO);
}
/**
* mq routingKey: {@link UcMqSelfConstants}.ROUTING_KEY_NOTICE_CHANNEL_DEAL_PREFIX_channelType
*/
default String getRoutingKey() {
return NoticeSendRecordUtils.getNoticeChannelDealKey(getChannelType());
}
/**
* 接收异步mq消息,处理send
*/
default void onMessage(TopicMqMessage<NoticeSendRecordDTO> message) {
try {
// mock用户
MockUtils.mockPlatUser();
send(message.getData());
} catch (Exception e) {
LOGGER.info("notice channel deal error:{}", e);
}
}
}

View File

@@ -0,0 +1,50 @@
package com.newyetai.usercenter.notice.service;
import java.util.List;
import com.newyetai.usercenter.notice.dto.NoticeContentTemplateQueryDTO;
import com.newyetai.usercenter.notice.dto.NoticeContentTemplateOperateDTO;
import com.newyetai.usercenter.notice.dto.NoticeContentTemplateDTO;
/**
* 通知消息体模版
*
* @author sr on 2020-12-20
*/
public interface NoticeContentTemplateService {
/**
* 新增
*
* @param noticeContentTemplateOperateDTO
* @return
* @author sr on 2020-12-20
*/
Long create(NoticeContentTemplateOperateDTO noticeContentTemplateOperateDTO);
/**
* 修改
*
* @param noticeContentTemplateOperateDTO
* @author sr on 2020-12-20
*/
void modify(NoticeContentTemplateOperateDTO noticeContentTemplateOperateDTO);
/**
* 删除
*
* @param id
* @author sr on 2020-12-20
*/
void remove(Long id);
/**
* 查询
*
* @param noticeContentTemplateQueryDTO
* @return
* @author sr on 2020-12-20
*/
List<NoticeContentTemplateDTO> page(NoticeContentTemplateQueryDTO noticeContentTemplateQueryDTO);
}

View File

@@ -0,0 +1,93 @@
package com.newyetai.usercenter.notice.service;
import java.util.List;
import java.util.Set;
import com.newyetai.usercenter.notice.dto.NoticeReceiverSettingDTO;
import com.newyetai.usercenter.notice.dto.NoticeReceiverSettingOperateDTO;
import com.newyetai.usercenter.notice.dto.NoticeReceiverSettingQueryDTO;
import com.newyetai.usercenter.notice.dto.NoticeReceiverSettingRemoveDTO;
import com.newyetai.usercenter.notice.dto.NoticeReceiverSettingRoleDTO;
import com.newyetai.usercenter.notice.dto.NoticeReceiverSettingUserDTO;
/**
* 通知接收人设置
*
* @author sr on 2020-12-20
*/
public interface NoticeReceiverSettingService {
/**
* 创建(新增)
*
* @param noticeReceiverSettingOperateDTO
* @author sr on 2021-01-07
*/
void create(NoticeReceiverSettingOperateDTO noticeReceiverSettingOperateDTO);
/**
* 保存设置(内部判断新增/删除)
*
* @param noticeReceiverSettingOperateDTO
* @return
* @author sr on 2020-12-20
*/
void save(NoticeReceiverSettingOperateDTO noticeReceiverSettingOperateDTO);
/**
* 删除
*
* @param id
* @author sr on 2020-12-20
*/
void remove(Long id);
/**
* 删除
*
* @param noticeReceiverSettingRemoveDTO
* @author sr on 2020-12-20
*/
void remove(NoticeReceiverSettingRemoveDTO noticeReceiverSettingRemoveDTO);
/**
* 查询
*
* @param noticeReceiverSettingQueryDTO
* @return
* @author sr on 2020-12-20
*/
List<NoticeReceiverSettingDTO> list(NoticeReceiverSettingQueryDTO noticeReceiverSettingQueryDTO);
/**
* 获取指定模版的所有接收人id
*
* @param templateId
* @param receiverOrgId
* @return
* @author sr on 2021-01-07
*/
Set<Long> getReceiverIds(Long templateId, Long receiverOrgId);
/**
* 查询接收人配置-人列表
*
* @param noticeReceiverSettingQueryDTO
* @return
* @author sr on 2021-01-07
*/
List<NoticeReceiverSettingUserDTO> listUser(
NoticeReceiverSettingQueryDTO noticeReceiverSettingQueryDTO);
/**
* 查询接收人配置-角色列表
*
* @param noticeReceiverSettingQueryDTO
* @return
* @author sr on 2021-01-07
*/
List<NoticeReceiverSettingRoleDTO> listRole(
NoticeReceiverSettingQueryDTO noticeReceiverSettingQueryDTO);
}

View File

@@ -0,0 +1,45 @@
package com.newyetai.usercenter.notice.service;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordDetailDTO;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordDetailQueryDTO;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordDetailReqDTO;
import java.util.List;
/**
* 通知发送记录明细(接收人)
*
* @author sr on 2020-12-20
*/
public interface NoticeSendRecordDetailService {
/**
* 查询
*
* @param noticeSendRecordDetailQueryDTO
* @return
* @author sr on 2020-12-20
*/
List<NoticeSendRecordDetailDTO> list(NoticeSendRecordDetailQueryDTO noticeSendRecordDetailQueryDTO);
/**
* 消息明细
*
* @param reqDTO 通知发送记录详细查询dto
* @return {@link NoticeSendRecordDetailDTO}
*/
NoticeSendRecordDetailDTO detail(NoticeSendRecordDetailReqDTO reqDTO);
/**
* 消息数量
*
* @param noticeSendRecordDetailQueryDTO 通知发送记录详细查询dto
* @return {@link Integer}
*/
Integer count(NoticeSendRecordDetailQueryDTO noticeSendRecordDetailQueryDTO);
void read(Long recordDetailId);
void readAll();
}

View File

@@ -0,0 +1,35 @@
package com.newyetai.usercenter.notice.service;
import java.util.List;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordQueryDTO;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordOperateDTO;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordDTO;
/**
* 通知发送记录(内容模版级)
*
* @author sr on 2020-12-20
*/
public interface NoticeSendRecordService {
/**
* 新增
*
* @param noticeSendRecordOperateDTO
* @return
* @author sr on 2020-12-20
*/
void create(NoticeSendRecordOperateDTO noticeSendRecordOperateDTO);
/**
* 查询
*
* @param noticeSendRecordQueryDTO
* @return
* @author sr on 2020-12-20
*/
List<NoticeSendRecordDTO> page(NoticeSendRecordQueryDTO noticeSendRecordQueryDTO);
}

View File

@@ -0,0 +1,65 @@
package com.newyetai.usercenter.notice.service;
import java.util.List;
import com.newyetai.usercenter.notice.dto.NoticeTemplateDTO;
import com.newyetai.usercenter.notice.dto.NoticeTemplateOperateDTO;
import com.newyetai.usercenter.notice.dto.NoticeTemplateQueryDTO;
/**
* 通知模版
*
* @author sr on 2020-12-17
*/
public interface NoticeTemplateService {
/**
* 新增
*
* @param noticeTemplateOperateDTO
* @return
* @author sr on 2020-12-17
*/
Long create(NoticeTemplateOperateDTO noticeTemplateOperateDTO);
/**
* 修改
*
* @param noticeTemplateOperateDTO
* @author sr on 2020-12-17
*/
void modify(NoticeTemplateOperateDTO noticeTemplateOperateDTO);
/**
* 删除
*
* @param id
* @author sr on 2020-12-17
*/
void remove(Long id);
/**
* 查询
*
* @param noticeTemplateQueryDTO
* @return
* @author sr on 2020-12-17
*/
List<NoticeTemplateDTO> page(NoticeTemplateQueryDTO noticeTemplateQueryDTO);
/**
* 校验模版
*
* @param templateId
* @author sr on 2020-12-28
*/
void checkTemplate(Long templateId);
/**
* @param id
* @return
* @author sr on 2021-02-01
*/
NoticeTemplateDTO find(Long id);
}

View File

@@ -0,0 +1,89 @@
package com.newyetai.usercenter.notice.service.impl;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.newyetai.common.exception.util.Assert;
import com.newyetai.common.util.UserContextHolder;
import com.newyetai.usercenter.notice.constant.NoticeChannelTypeEnum;
import com.newyetai.usercenter.notice.dao.NoticeContentTemplateMapper;
import com.newyetai.usercenter.notice.dto.NoticeContentTemplateDTO;
import com.newyetai.usercenter.notice.dto.NoticeContentTemplateOperateDTO;
import com.newyetai.usercenter.notice.dto.NoticeContentTemplateQueryDTO;
import com.newyetai.usercenter.notice.entity.NoticeContentTemplate;
import com.newyetai.usercenter.notice.mapstruct.NoticeContentTemplateMapMapper;
import com.newyetai.usercenter.notice.service.NoticeContentTemplateService;
import com.newyetai.usercenter.notice.service.NoticeTemplateService;
/**
* @author sr on 2020-12-20
*/
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class NoticeContentTemplateServiceImpl implements NoticeContentTemplateService {
private final NoticeContentTemplateMapper noticeContentTemplateMapper;
private final NoticeTemplateService noticeTemplateService;
private void checkExist(Long templateId, Integer channelType) {
boolean exists = noticeContentTemplateMapper.existsEntity(
NoticeContentTemplate.builder().templateId(templateId).channelType(channelType).deleted(false).build());
Assert.isTrue(!exists, "该模版消息通道类型已存在");
}
@Override
@Transactional
public Long create(NoticeContentTemplateOperateDTO noticeContentTemplateOperateDTO) {
Assert.isTrue(
NoticeChannelTypeEnum.SITE.getType()
.equals(noticeContentTemplateOperateDTO.getChannelType()),
"暂只支持站内信配置");
Long templateId = noticeContentTemplateOperateDTO.getTemplateId();
// 校验模版是否有效
noticeTemplateService.checkTemplate(templateId);
this.checkExist(templateId,
noticeContentTemplateOperateDTO.getChannelType());
// 设置初始值
if (noticeContentTemplateOperateDTO.getEnabled() == null) {
noticeContentTemplateOperateDTO.setEnabled(true);
}
NoticeContentTemplate noticeContentTemplate =
NoticeContentTemplateMapMapper.INSTANCE.toEntity(noticeContentTemplateOperateDTO);
noticeContentTemplateMapper.saveEntity(noticeContentTemplate,
UserContextHolder.getLoginUserId());
return noticeContentTemplate.getId();
}
@Override
@Transactional
public void modify(NoticeContentTemplateOperateDTO noticeContentTemplateOperateDTO) {
noticeContentTemplateMapper.updateEntitySelective(
NoticeContentTemplate.builder().id(noticeContentTemplateOperateDTO.getId())
.channelType(noticeContentTemplateOperateDTO.getChannelType())
.title(noticeContentTemplateOperateDTO.getTitle())
.contentTemplate(noticeContentTemplateOperateDTO.getContentTemplate())
.enabled(noticeContentTemplateOperateDTO.getEnabled())
.link(noticeContentTemplateOperateDTO.getLink())
.build(),
UserContextHolder.getLoginUserId());
}
@Override
@Transactional
public void remove(Long id) {
noticeContentTemplateMapper.deleteEntity(NoticeContentTemplate.builder().id(id).build(),
UserContextHolder.getLoginUserId());
}
@Override
public List<NoticeContentTemplateDTO> page(
NoticeContentTemplateQueryDTO noticeContentTemplateQueryDTO) {
return noticeContentTemplateMapper.listNoticeContentTemplateDTO(noticeContentTemplateQueryDTO);
}
}

View File

@@ -0,0 +1,162 @@
package com.newyetai.usercenter.notice.service.impl;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.google.common.collect.Sets;
import com.newyetai.common.constant.CommonConstants;
import com.newyetai.common.exception.BusinessException;
import com.newyetai.common.exception.util.Assert;
import com.newyetai.common.util.UserContextHolder;
import com.newyetai.usercenter.notice.constant.NoticeLevelEnum;
import com.newyetai.usercenter.notice.constant.NoticeReceiverTypeEnum;
import com.newyetai.usercenter.notice.dao.NoticeReceiverSettingMapper;
import com.newyetai.usercenter.notice.dao.NoticeTemplateMapper;
import com.newyetai.usercenter.notice.dto.NoticeReceiverSettingDTO;
import com.newyetai.usercenter.notice.dto.NoticeReceiverSettingOperateDTO;
import com.newyetai.usercenter.notice.dto.NoticeReceiverSettingQueryDTO;
import com.newyetai.usercenter.notice.dto.NoticeReceiverSettingRemoveDTO;
import com.newyetai.usercenter.notice.dto.NoticeReceiverSettingRoleDTO;
import com.newyetai.usercenter.notice.dto.NoticeReceiverSettingUserDTO;
import com.newyetai.usercenter.notice.entity.NoticeReceiverSetting;
import com.newyetai.usercenter.notice.entity.NoticeTemplate;
import com.newyetai.usercenter.notice.mapstruct.NoticeReceiverSettingMapMapper;
import com.newyetai.usercenter.notice.service.NoticeReceiverSettingService;
/**
* @author sr on 2020-12-20
*/
@Service
public class NoticeReceiverSettingServiceImpl implements NoticeReceiverSettingService {
@Autowired
private NoticeReceiverSettingMapper noticeReceiverSettingMapper;
@Autowired
private NoticeTemplateMapper noticeTemplateMapper;
@Override
@Transactional
public void create(NoticeReceiverSettingOperateDTO noticeReceiverSettingOperateDTO) {
this.save(noticeReceiverSettingOperateDTO, true);
}
@Override
@Transactional
public void save(NoticeReceiverSettingOperateDTO noticeReceiverSettingOperateDTO) {
this.save(noticeReceiverSettingOperateDTO, false);
}
private void save(NoticeReceiverSettingOperateDTO noticeReceiverSettingOperateDTO, boolean created) {
NoticeTemplate noticeTemplate =
noticeTemplateMapper.getById(noticeReceiverSettingOperateDTO.getTemplateId());
if (NoticeLevelEnum.PLATFORM.getType().equals(noticeTemplate.getLevel())
&& !CommonConstants.PLATFORM_ORG_ID
.equals(noticeReceiverSettingOperateDTO.getOperateOrgId())) {
throw new BusinessException("该模版不支持机构设置");
}
// 校验传入接收人信息是否有效
Long orgId = noticeReceiverSettingOperateDTO.getOperateOrgId();
Integer receiverUnionType = noticeReceiverSettingOperateDTO.getReceiverUnionType();
Set<Long> newReceiverUnionIds = noticeReceiverSettingOperateDTO.getReceiverUnionIds();
if (NoticeReceiverTypeEnum.USER.getType().equals(receiverUnionType)) {
Assert.isTrue(noticeReceiverSettingMapper.validUser(orgId, newReceiverUnionIds)
.size() == newReceiverUnionIds.size(), "接收人关联无效");
} else if (NoticeReceiverTypeEnum.ROLE.getType().equals(receiverUnionType)) {
Assert.isTrue(noticeReceiverSettingMapper.validRole(orgId, newReceiverUnionIds)
.size() == newReceiverUnionIds.size(), "接收人关联无效");
}
// 查询当前机构现有templateId/receiverUnionType 配置
Set<Long> currentReceiverUnionIds =
noticeReceiverSettingMapper.findReceiverUnionIds(noticeReceiverSettingOperateDTO);
// 新增
Set<Long> createReceiverUnionIds = Sets.newHashSet(newReceiverUnionIds);
createReceiverUnionIds.removeAll(currentReceiverUnionIds);
if (!createReceiverUnionIds.isEmpty()) {
noticeReceiverSettingMapper.create(noticeReceiverSettingOperateDTO, createReceiverUnionIds);
}
// 新增不处理删除
if (!created) {
// 删除
Set<Long> removeReceiverUnionIds = Sets.newHashSet(currentReceiverUnionIds);
removeReceiverUnionIds.removeAll(newReceiverUnionIds);
if (!removeReceiverUnionIds.isEmpty()) {
NoticeReceiverSettingRemoveDTO removeDto =
NoticeReceiverSettingMapMapper.INSTANCE.toRemoveDTO(noticeReceiverSettingOperateDTO);
removeDto.setReceiverUnionIds(removeReceiverUnionIds);
this.remove(removeDto);
}
}
}
@Override
@Transactional
public void remove(Long id) {
noticeReceiverSettingMapper.deleteEntity(NoticeReceiverSetting.builder().id(id).build(),
UserContextHolder.getLoginUserId());
}
@Override
@Transactional
public void remove(NoticeReceiverSettingRemoveDTO noticeReceiverSettingRemoveDTO) {
// 只能删除当前登录人机构的配置;如需代机构删除配置请另外实现
noticeReceiverSettingMapper.remove(noticeReceiverSettingRemoveDTO);
}
@Override
public List<NoticeReceiverSettingDTO> list(
NoticeReceiverSettingQueryDTO noticeReceiverSettingQueryDTO) {
// 暂只支持查询当前机构
noticeReceiverSettingQueryDTO.setOrgId(noticeReceiverSettingQueryDTO.getOperateOrgId());
return noticeReceiverSettingMapper.listNoticeReceiverSettingDTO(noticeReceiverSettingQueryDTO);
}
@Override
public Set<Long> getReceiverIds(Long templateId, Long receiverOrgId) {
// 获取接收人配置
List<NoticeReceiverSettingDTO> noticeReceiverSettingDTOs =
noticeReceiverSettingMapper.listNoticeReceiverSettingDTO(NoticeReceiverSettingQueryDTO
.builder().templateId(templateId).orgId(receiverOrgId).build());
Map<Integer, Set<Long>> noticeReceiverSettingMap =
noticeReceiverSettingDTOs.stream()
.collect(Collectors.toMap(NoticeReceiverSettingDTO::getReceiverUnionType,
dto -> Sets.newHashSet(dto.getReceiverUnionId()), (o, n) -> {
o.addAll(n);
return o;
}, HashMap::new));
// 根据接收人配置获取人id; orgId+unionType+unionIds
Set<Long> userIds = Sets.newHashSet();
noticeReceiverSettingMap.forEach((k, v) -> {
if (NoticeReceiverTypeEnum.USER.getType().equals(k)) {
userIds.addAll(v);
} else {
userIds
.addAll(noticeReceiverSettingMapper.findUserIdByUnionType(receiverOrgId, k, v));
}
});
return userIds;
}
@Override
public List<NoticeReceiverSettingUserDTO> listUser(
NoticeReceiverSettingQueryDTO noticeReceiverSettingQueryDTO) {
return noticeReceiverSettingMapper.listNoticeReceiverSettingUserDTO(noticeReceiverSettingQueryDTO);
}
@Override
public List<NoticeReceiverSettingRoleDTO> listRole(
NoticeReceiverSettingQueryDTO noticeReceiverSettingQueryDTO) {
return noticeReceiverSettingMapper.listNoticeReceiverSettingRoleDTO(noticeReceiverSettingQueryDTO);
}
}

View File

@@ -0,0 +1,62 @@
package com.newyetai.usercenter.notice.service.impl;
import com.newyetai.common.exception.util.Assert;
import com.newyetai.usercenter.notice.constant.NoticeChannelTypeEnum;
import com.newyetai.usercenter.notice.dao.NoticeSendRecordDetailMapper;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordDetailDTO;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordDetailQueryDTO;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordDetailReqDTO;
import com.newyetai.usercenter.notice.service.NoticeSendRecordDetailService;
import com.newyetai.usercenter.notice.util.NoticeSendRecordDetailUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* @author sr on 2020-12-20
*/
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class NoticeSendRecordDetailServiceImpl implements NoticeSendRecordDetailService {
private final NoticeSendRecordDetailMapper noticeSendRecordDetailMapper;
@Override
public NoticeSendRecordDetailDTO detail(NoticeSendRecordDetailReqDTO reqDTO) {
return noticeSendRecordDetailMapper.findNoticeSendRecordDetailDTO(reqDTO);
}
@Override
public List<NoticeSendRecordDetailDTO> list(
NoticeSendRecordDetailQueryDTO noticeSendRecordDetailQueryDTO) {
return noticeSendRecordDetailMapper
.listNoticeSendRecordDetailDTO(noticeSendRecordDetailQueryDTO);
}
@Override
public Integer count(NoticeSendRecordDetailQueryDTO noticeSendRecordDetailQueryDTO) {
noticeSendRecordDetailQueryDTO.setNeedPage(Boolean.FALSE);
noticeSendRecordDetailQueryDTO.setPageSize(0);
return noticeSendRecordDetailMapper
.countNoticeSendRecordDetail(noticeSendRecordDetailQueryDTO);
}
@Override
@Transactional
public void read(Long recordDetailId) {
Assert.notNull(recordDetailId, "通知明细id不能为空");
int modifyNum = noticeSendRecordDetailMapper
.modifyStatus(NoticeSendRecordDetailUtils.buildRead(recordDetailId, NoticeChannelTypeEnum.SITE.getType()));
Assert.isTrue(modifyNum > 0, "请勿重复读取,请检查数据或刷新数据");
}
@Override
@Transactional
public void readAll() {
noticeSendRecordDetailMapper.modifyStatus(NoticeSendRecordDetailUtils.buildReadAll(NoticeChannelTypeEnum.SITE.getType()));
}
}

View File

@@ -0,0 +1,181 @@
package com.newyetai.usercenter.notice.service.impl;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.newyetai.common.constant.CommonConstants;
import com.newyetai.common.exception.util.Assert;
import com.newyetai.common.util.BaseDtoUtils;
import com.newyetai.common.util.JsonUtils;
import com.newyetai.common.util.UserContextHolder;
import com.newyetai.usercenter.notice.constant.NoticeLevelEnum;
import com.newyetai.usercenter.notice.constant.NoticeReceiverStatusEnum;
import com.newyetai.usercenter.notice.constant.NoticeSendStatusEnum;
import com.newyetai.usercenter.notice.dao.NoticeContentTemplateMapper;
import com.newyetai.usercenter.notice.dao.NoticeSendRecordDetailMapper;
import com.newyetai.usercenter.notice.dao.NoticeSendRecordMapper;
import com.newyetai.usercenter.notice.dao.NoticeTemplateMapper;
import com.newyetai.usercenter.notice.dto.NoticeContentTemplateDTO;
import com.newyetai.usercenter.notice.dto.NoticeContentTemplateQueryDTO;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordDTO;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordOperateDTO;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordQueryDTO;
import com.newyetai.usercenter.notice.dto.NoticeTemplateDTO;
import com.newyetai.usercenter.notice.dto.NoticeTemplateQueryDTO;
import com.newyetai.usercenter.notice.entity.NoticeSendRecord;
import com.newyetai.usercenter.notice.entity.NoticeSendRecordDetail;
import com.newyetai.usercenter.notice.mapstruct.NoticeSendRecordMapMapper;
import com.newyetai.usercenter.notice.service.INoticeChannelProvider;
import com.newyetai.usercenter.notice.service.NoticeReceiverSettingService;
import com.newyetai.usercenter.notice.service.NoticeSendRecordService;
import lombok.extern.slf4j.Slf4j;
/**
* @author sr on 2020-12-20
*/
@Service
@Slf4j
public class NoticeSendRecordServiceImpl implements NoticeSendRecordService {
@Autowired
private NoticeSendRecordMapper noticeSendRecordMapper;
@Autowired
private NoticeTemplateMapper noticeTemplateMapper;
@Autowired
private NoticeContentTemplateMapper noticeContentTemplateMapper;
@Autowired
private NoticeReceiverSettingService noticeReceiverSettingService;
@Autowired
private NoticeSendRecordDetailMapper noticeSendRecordDetailMapper;
private Map<Integer, INoticeChannelProvider> channelProviderMap;
@Autowired
public void setChannelProviderMap(List<INoticeChannelProvider> channelProviders) {
channelProviderMap =
channelProviders.stream()
.collect(Collectors.toMap(k -> k.getChannelType(), v -> v));
}
@Override
@Transactional
public void create(NoticeSendRecordOperateDTO noticeSendRecordOperateDTO) {
// 克隆操作对象,清洗参数,替换流程中需要的正确的id等属性
NoticeSendRecordOperateDTO tempOperateDto =
NoticeSendRecordMapMapper.INSTANCE.clone(noticeSendRecordOperateDTO);
Long templateId = noticeSendRecordOperateDTO.getTemplateId();
String templateCode = noticeSendRecordOperateDTO.getTemplateCode();
// 判断参数必填
Assert.isTrue(templateId != null || StringUtils.isNotBlank(templateCode), "通知模版参数缺失");
// 获取模版,级别-》机构id
NoticeTemplateQueryDTO noticeTemplateQueryDTO =
NoticeTemplateQueryDTO.builder().id(templateId).templateCode(templateCode).enabled(true)
.build();
noticeTemplateQueryDTO.setNeedPage(false);
List<NoticeTemplateDTO> noticeTemplateDTOs =
noticeTemplateMapper.listNoticeTemplateDTO(noticeTemplateQueryDTO);
Assert.isTrue(!noticeTemplateDTOs.isEmpty(), "未找到对应通知模版");
NoticeTemplateDTO noticeTemplateDTO = noticeTemplateDTOs.get(0);
tempOperateDto.setTemplateId(noticeTemplateDTO.getId());
// 平台模版指定接收人机构为平台
Long receiverOrgId =
NoticeLevelEnum.PLATFORM.getType().equals(noticeTemplateDTOs.get(0).getLevel())
? CommonConstants.PLATFORM_ORG_ID
: noticeSendRecordOperateDTO.getReceiverOrgId();
if (receiverOrgId == null) {
receiverOrgId = noticeSendRecordOperateDTO.getOperateOrgId();
}
tempOperateDto.setReceiverOrgId(receiverOrgId);
// 是否定制内容模版
if (BooleanUtils.isTrue(noticeSendRecordOperateDTO.getCustomContent())) {
Assert.isTrue(noticeSendRecordOperateDTO.getChannelType() != null, "定制内容模版,消息通道类型不能为空");
dealByChannel(tempOperateDto,
NoticeSendRecordMapMapper.INSTANCE.toContentTemplate(tempOperateDto));
} else {
// 获取内容模版, 未指定模版->获取所有内容模版
List<NoticeContentTemplateDTO> noticeContentTemplateDTOs = noticeContentTemplateMapper
.listNoticeContentTemplateDTO(NoticeContentTemplateQueryDTO.builder()
.id(noticeSendRecordOperateDTO.getContentTemplateId())
.templateId(tempOperateDto.getTemplateId())
.channelType(noticeSendRecordOperateDTO.getChannelType()).enabled(true).build());
Assert.isTrue(!noticeContentTemplateDTOs.isEmpty(), "未找到对应通知内容模版");
noticeContentTemplateDTOs.forEach(
noticeContentTemplateDTO -> dealByChannel(tempOperateDto,
noticeContentTemplateDTO));
}
}
private void dealByChannel(NoticeSendRecordOperateDTO noticeSendRecordOperateDTO,
NoticeContentTemplateDTO noticeContentTemplateDTO) {
INoticeChannelProvider channelProvicer =
channelProviderMap.get(noticeContentTemplateDTO.getChannelType());
if (channelProvicer == null) {
log.error("无对应消息通道处理...");
}
Set<Long> receiverUserIds = noticeSendRecordOperateDTO.getReceiverUserIds();
NoticeSendRecordDTO noticeSendRecordDTO =
NoticeSendRecordDTO.builder().templateId(noticeSendRecordOperateDTO.getTemplateId())
.senderOrgId(noticeSendRecordOperateDTO.getOperateOrgId())
.receiverOrgId(noticeSendRecordOperateDTO.getReceiverOrgId())
.contentTemplateId(noticeContentTemplateDTO.getId())
.contentParamData(
JsonUtils.toJsonString(noticeSendRecordOperateDTO.getContentParamDataMap()))
.appointed(CollectionUtils.isNotEmpty(receiverUserIds))
.status(NoticeSendStatusEnum.INIT.getType())
.channelType(noticeContentTemplateDTO.getChannelType())
.title(noticeContentTemplateDTO.getTitle())
.contentTemplate(noticeContentTemplateDTO.getContentTemplate())
.link(noticeContentTemplateDTO.getLink()).build();
this.createDetail(noticeSendRecordDTO, receiverUserIds, NoticeReceiverStatusEnum.INIT.getType());
// mq 触发消息通道真实处理流程
channelProvicer.asyncDeal(noticeSendRecordDTO);
}
private void createDetail(NoticeSendRecordDTO noticeSendRecordDTO, Set<Long> receiverUserIds,
Integer receiverStatus) {
NoticeSendRecord noticeSendRecord =
NoticeSendRecordMapMapper.INSTANCE.toEntity(noticeSendRecordDTO);
noticeSendRecordMapper.saveEntity(noticeSendRecord,
UserContextHolder.getLoginUserId());
BaseDtoUtils.createCopy(noticeSendRecord, noticeSendRecordDTO);
// TODO 根据channel获取接收人相关帐号List<NoticeSendRecordDetailOperateDTO> noticeSendRecordDetailOperateDTOs
if (CollectionUtils.isEmpty(receiverUserIds)) {
receiverUserIds =
noticeReceiverSettingService.getReceiverIds(noticeSendRecordDTO.getTemplateId(),
noticeSendRecordDTO.getReceiverOrgId());
}
// 插入发送记录明细;占位符替换内容模版内容
Long recordId = noticeSendRecord.getId();
List<NoticeSendRecordDetail> noticeSendRecordDetails = receiverUserIds.stream()
.map(userId -> NoticeSendRecordDetail.builder().recordId(recordId).userId(userId)
.receiverStatus(receiverStatus).build())
.collect(Collectors.toList());
noticeSendRecordDetailMapper.saveEntites(noticeSendRecordDetails,
UserContextHolder.getLoginUserId());
}
@Override
public List<NoticeSendRecordDTO> page(NoticeSendRecordQueryDTO noticeSendRecordQueryDTO) {
// 暂只支持查询当前机构
noticeSendRecordQueryDTO.setSenderOrgId(noticeSendRecordQueryDTO.getOperateOrgId());
return noticeSendRecordMapper.listNoticeSendRecordDTO(noticeSendRecordQueryDTO);
}
}

View File

@@ -0,0 +1,94 @@
package com.newyetai.usercenter.notice.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.newyetai.common.constant.CommonConstants;
import com.newyetai.common.exception.util.Assert;
import com.newyetai.common.util.UserContextHolder;
import com.newyetai.usercenter.notice.constant.NoticeLevelEnum;
import com.newyetai.usercenter.notice.dao.NoticeTemplateMapper;
import com.newyetai.usercenter.notice.dto.NoticeTemplateDTO;
import com.newyetai.usercenter.notice.dto.NoticeTemplateOperateDTO;
import com.newyetai.usercenter.notice.dto.NoticeTemplateQueryDTO;
import com.newyetai.usercenter.notice.entity.NoticeTemplate;
import com.newyetai.usercenter.notice.mapstruct.NoticeTemplateMapMapper;
import com.newyetai.usercenter.notice.service.NoticeTemplateService;
/**
* @author sr on 2020-12-17
*/
@Service
public class NoticeTemplateServiceImpl implements NoticeTemplateService {
@Autowired
private NoticeTemplateMapper noticeTemplateMapper;
private void exist(NoticeTemplateOperateDTO noticeTemplateOperateDTO) {
// templateCode 验重
boolean exists = noticeTemplateMapper.existsEntity(
NoticeTemplate.builder().id(noticeTemplateOperateDTO.getId())
.templateCode(noticeTemplateOperateDTO.getTemplateCode()).build());
Assert.isTrue(!exists, "模版标识已存在");
Assert.isTrue(
NoticeLevelEnum.ORG.getType().equals(noticeTemplateOperateDTO.getLevel())
|| CommonConstants.PLATFORM_ORG_ID.equals(noticeTemplateOperateDTO.getOperateOrgId()),
"不支持机构设置该级别模版");
}
@Override
@Transactional
public Long create(NoticeTemplateOperateDTO noticeTemplateOperateDTO) {
this.exist(noticeTemplateOperateDTO);
// 设置初始值
if (noticeTemplateOperateDTO.getEnabled() == null) {
noticeTemplateOperateDTO.setEnabled(true);
}
NoticeTemplate noticeTemplate =
NoticeTemplateMapMapper.INSTANCE.toEntity(noticeTemplateOperateDTO);
noticeTemplateMapper.saveEntity(noticeTemplate, UserContextHolder.getLoginUserId());
return noticeTemplate.getId();
}
@Override
@Transactional
public void modify(NoticeTemplateOperateDTO noticeTemplateOperateDTO) {
this.exist(noticeTemplateOperateDTO);
NoticeTemplate noticeTemplate =
NoticeTemplateMapMapper.INSTANCE.toEntity(noticeTemplateOperateDTO);
noticeTemplateMapper.updateEntitySelective(noticeTemplate, UserContextHolder.getLoginUserId());
}
@Override
@Transactional
public void remove(Long id) {
noticeTemplateMapper.deleteEntity(NoticeTemplate.builder().id(id).build(),
UserContextHolder.getLoginUserId());
}
@Override
public List<NoticeTemplateDTO> page(NoticeTemplateQueryDTO noticeTemplateQueryDTO) {
return noticeTemplateMapper.listNoticeTemplateDTO(noticeTemplateQueryDTO);
}
@Override
public void checkTemplate(Long templateId) {
NoticeTemplate noticeTemplate = noticeTemplateMapper.getById(templateId);
Assert.isTrue(noticeTemplate != null, "未找到对应通知模版");
Assert.isTrue(noticeTemplate.getEnabled(), "该通知模版无法操作");
}
@Override
public NoticeTemplateDTO find(Long id) {
Assert.notNull(id, "id为空");
List<NoticeTemplateDTO> templateDtos =
noticeTemplateMapper.listNoticeTemplateDTO(NoticeTemplateQueryDTO.builder().id(id).build());
Assert.isTrue(!templateDtos.isEmpty(), "未找到对应模版");
return templateDtos.get(0);
}
}

View File

@@ -0,0 +1,124 @@
package com.newyetai.usercenter.notice.service.provider;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.transaction.annotation.Transactional;
import com.google.common.collect.Sets;
import com.newyetai.common.AlitaResult;
import com.newyetai.common.exception.util.Assert;
import com.newyetai.common.util.JsonUtils;
import com.newyetai.usercenter.notice.constant.NoticeReceiverStatusEnum;
import com.newyetai.usercenter.notice.constant.NoticeSendStatusEnum;
import com.newyetai.usercenter.notice.dao.NoticeSendRecordDetailMapper;
import com.newyetai.usercenter.notice.dao.NoticeSendRecordMapper;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordDTO;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordDetailDTO;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordDetailQueryDTO;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordModifyDTO;
import com.newyetai.usercenter.notice.service.INoticeChannelProvider;
import com.newyetai.usercenter.notice.util.NoticeSendRecordDetailUtils;
import lombok.extern.slf4j.Slf4j;
/**
* 通知处理抽象类
*
* @author sr on 2021-02-19
*/
@Slf4j
public abstract class AbstractNoticeChannelProvider implements INoticeChannelProvider {
private NoticeSendRecordMapper noticeSendRecordMapper;
private NoticeSendRecordDetailMapper noticeSendRecordDetailMapper;
public AbstractNoticeChannelProvider(NoticeSendRecordMapper noticeSendRecordMapper,
NoticeSendRecordDetailMapper noticeSendRecordDetailMapper) {
this.noticeSendRecordMapper = noticeSendRecordMapper;
this.noticeSendRecordDetailMapper = noticeSendRecordDetailMapper;
}
public void beforeSendDetails(NoticeSendRecordDTO noticeSendRecordDTO) {}
/**
* 处理发送记录下所有明细
* @param noticeSendRecordDTO
* @author sr on 2021-02-19
*/
public void sendDetails(NoticeSendRecordDTO noticeSendRecordDTO) {
NoticeSendRecordDetailQueryDTO noticeSendRecordDetailQueryDTO =
NoticeSendRecordDetailQueryDTO.builder().recordId(noticeSendRecordDTO.getId())
.receiverStatus(NoticeReceiverStatusEnum.INIT.getType()).build();
List<NoticeSendRecordDetailDTO> recordDetails =
noticeSendRecordDetailMapper
.listNoticeSendRecordDetailDTO(noticeSendRecordDetailQueryDTO);
if (recordDetails.isEmpty()) {
return;
}
Set<Long> sucRecordDetailIds = Sets.newHashSetWithExpectedSize(recordDetails.size());
Set<Long> errRecordDetailIds = Sets.newHashSetWithExpectedSize(recordDetails.size());
recordDetails.forEach(detail -> {
AlitaResult<?> invokeResult = null;
try {
invokeResult = this.invoke(noticeSendRecordDTO, detail);
} catch (Exception e) {
invokeResult = AlitaResult.bizError(ExceptionUtils.getStackTrace(e));
}
if (invokeResult.getSuccess()) {
sucRecordDetailIds.add(detail.getId());
} else {
errRecordDetailIds.add(detail.getId());
log.error("notice sendDetail, id-{} error:{}", detail.getId(), invokeResult.getMsg());
}
});
// 更新状态
if (!sucRecordDetailIds.isEmpty()) {
noticeSendRecordDetailMapper.modifyStatus(NoticeSendRecordDetailUtils.buildSend(
sucRecordDetailIds, getChannelType(), NoticeReceiverStatusEnum.SENT.getType()));
}
if (!errRecordDetailIds.isEmpty()) {
noticeSendRecordDetailMapper.modifyStatus(NoticeSendRecordDetailUtils.buildSend(
errRecordDetailIds, getChannelType(), NoticeReceiverStatusEnum.SEND_FAIL.getType()));
}
}
public void afterSendDetails(NoticeSendRecordDTO noticeSendRecordDTO) {}
/**
* 单个明细真实发送处理
* @param noticeSendRecordDTO
* @param noticeSendRecordDetailDTO
* @return
* @author sr on 2021-02-19
*/
public AlitaResult<?> invoke(NoticeSendRecordDTO noticeSendRecordDTO,
NoticeSendRecordDetailDTO noticeSendRecordDetailDTO) {
return AlitaResult.bizError("未实现单个明细实际调用");
}
@SuppressWarnings("unchecked")
@Transactional
public void send(NoticeSendRecordDTO noticeSendRecordDTO) {
// 组装消息体
String contentTemplate = noticeSendRecordDTO.getContentTemplate();
String content = this.format(contentTemplate,
JsonUtils.toObject(noticeSendRecordDTO.getContentParamData(), Map.class));
noticeSendRecordDTO.setContent(content);
int updateNum = noticeSendRecordMapper
.modify(NoticeSendRecordModifyDTO.builder().id(noticeSendRecordDTO.getId())
.oldStatus(NoticeSendStatusEnum.INIT.getType())
.newStatus(NoticeSendStatusEnum.SENT.getType())
.content(content).build());
Assert.isTrue(updateNum > 0, "当前通知发送记录无法操作");
beforeSendDetails(noticeSendRecordDTO);
this.sendDetails(noticeSendRecordDTO);
afterSendDetails(noticeSendRecordDTO);
}
}

View File

@@ -0,0 +1,47 @@
package com.newyetai.usercenter.notice.service.provider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.newyetai.common.AlitaResult;
import com.newyetai.mq.producer.sender.IMqSender;
import com.newyetai.mq.util.MqSendUtils;
import com.newyetai.usercenter.notice.constant.NoticeChannelTypeEnum;
import com.newyetai.usercenter.notice.dao.NoticeSendRecordDetailMapper;
import com.newyetai.usercenter.notice.dao.NoticeSendRecordMapper;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordDTO;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordDetailDTO;
/**
* 站内信
*
* @author sr on 2021-01-04
*/
@Service
public class SiteNoticeChannelProvider extends AbstractNoticeChannelProvider {
public SiteNoticeChannelProvider(NoticeSendRecordMapper noticeSendRecordMapper,
NoticeSendRecordDetailMapper noticeSendRecordDetailMapper) {
super(noticeSendRecordMapper, noticeSendRecordDetailMapper);
}
@Override
public Integer getChannelType() {
return NoticeChannelTypeEnum.SITE.getType();
}
public AlitaResult<?> invoke(NoticeSendRecordDTO noticeSendRecordDTO,
NoticeSendRecordDetailDTO noticeSendRecordDetailDTO) {
/* TODO mq实现通知各系统(websocket)
AlitaResult<?> mqResult = MqSendUtils.send(UcMqConstants.ROUTING_KEY_SITE_NOTICE, detail);
Long detailId = detail.getId();
if (mqResult.getSuccess()) {
return true;
} else {
return false;
}*/
return noticeSendRecordDTO.getContent() != null ? AlitaResult.success()
: AlitaResult.bizError("消息内容为空,模版替换失败");
}
}

View File

@@ -0,0 +1,98 @@
package com.newyetai.usercenter.notice.service.provider;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.newyetai.common.AlitaResult;
import com.newyetai.common.exception.util.Assert;
import com.newyetai.sdk.wechat.WechatClient;
import com.newyetai.sdk.wechat.model.KeyData;
import com.newyetai.sdk.wechat.model.TemplateMessageReq;
import com.newyetai.sdk.wechat.util.MessageParamUtils;
import com.newyetai.usercenter.auth.constant.AuthTypeEnum;
import com.newyetai.usercenter.auth.dto.AuthClientQueryDTO;
import com.newyetai.usercenter.auth.dto.AuthDetailDTO;
import com.newyetai.usercenter.auth.dto.AuthDetailQueryDTO;
import com.newyetai.usercenter.auth.service.AuthDetailService;
import com.newyetai.usercenter.auth.util.AuthClientUtils;
import com.newyetai.usercenter.notice.constant.NoticeChannelTypeEnum;
import com.newyetai.usercenter.notice.dao.NoticeSendRecordDetailMapper;
import com.newyetai.usercenter.notice.dao.NoticeSendRecordMapper;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordDTO;
import com.newyetai.usercenter.notice.dto.NoticeSendRecordDetailDTO;
/**
* 微信公众号模版消息发送
* @author sr on 2021-02-19
*/
@Service
public class WechatOffiaccountNoticeChannelProvider extends AbstractNoticeChannelProvider {
@Autowired
private AuthDetailService authDetailService;
/** 缓存微信公众号模版参数 recordId:templateData **/
private Map<Long, Map<String, KeyData>> recordTemplateData =
new ConcurrentHashMap<Long, Map<String, KeyData>>(200);
public WechatOffiaccountNoticeChannelProvider(NoticeSendRecordMapper noticeSendRecordMapper,
NoticeSendRecordDetailMapper noticeSendRecordDetailMapper) {
super(noticeSendRecordMapper, noticeSendRecordDetailMapper);
}
@Override
public Integer getChannelType() {
return NoticeChannelTypeEnum.WECHAT_OFFIACCOUNT.getType();
}
@Override
public String format(String contentTemplate, Map<String, Object> contentParamDataMap) {
return null;
}
@Override
public void beforeSendDetails(NoticeSendRecordDTO noticeSendRecordDTO) {
Long recordId = noticeSendRecordDTO.getId();
Map<String, KeyData> templateData = recordTemplateData.get(recordId);
if (templateData == null) {
templateData =
MessageParamUtils.dealData(noticeSendRecordDTO.getContentParamDataMap());
recordTemplateData.put(recordId, templateData);
}
}
@Override
public AlitaResult<?> invoke(NoticeSendRecordDTO noticeSendRecordDTO,
NoticeSendRecordDetailDTO noticeSendRecordDetailDTO) {
Long userId = noticeSendRecordDetailDTO.getUserId();
Assert.isTrue(userId != null, "用户id为空");
// 查询微信授权信息
List<AuthDetailDTO> authDetailDTOs = authDetailService.list(AuthDetailQueryDTO.builder()
.authTypeCode(AuthTypeEnum.WECHAT.getCode()).userId(userId).build());
Assert.isTrue(!authDetailDTOs.isEmpty(), "未找到用户微信授权信息");
AuthDetailDTO authDetailDTO = authDetailDTOs.get(0);
String openId = authDetailDTO.getOpenId();
// 发送公众号
String token = AuthClientUtils
.getService().getAccessToken(AuthClientQueryDTO.builder().id(authDetailDTO.getAuthClientId()).build());
TemplateMessageReq templateMessageRequestParam =
TemplateMessageReq.builder().accessToken(
token)
.toUser(openId)
.templateId(noticeSendRecordDTO.getContentTemplate())
.data(recordTemplateData.get(noticeSendRecordDTO.getId()))
.url(noticeSendRecordDTO.getLink()).build();
return WechatClient.sendTemplateMessage(templateMessageRequestParam);
}
@Override
public void afterSendDetails(NoticeSendRecordDTO noticeSendRecordDTO) {
recordTemplateData.remove(noticeSendRecordDTO.getId());
}
}

View File

@@ -0,0 +1,34 @@
package com.newyetai.usercenter.notice.util;
import java.util.Set;
import com.newyetai.usercenter.notice.constant.NoticeReceiverStatusEnum;
import com.newyetai.usercenter.notice.dto.RecordDetailUpdateStatusDTO;
/**
* @author sr on 2020-12-20
*/
public class NoticeSendRecordDetailUtils {
public static RecordDetailUpdateStatusDTO buildRead(Long recordDetailId, Integer channelType) {
RecordDetailUpdateStatusDTO recordDetailUpdateStatusDTO = buildReadAll(channelType);
recordDetailUpdateStatusDTO.setRecordDetailId(recordDetailId);
return recordDetailUpdateStatusDTO;
}
public static RecordDetailUpdateStatusDTO buildReadAll(Integer channelType) {
return RecordDetailUpdateStatusDTO.builder().channelType(channelType)
.oldStatus(NoticeReceiverStatusEnum.SENT.getType())
.newStatus(NoticeReceiverStatusEnum.READ.getType()).build();
}
public static RecordDetailUpdateStatusDTO buildSend(Set<Long> recordDetailIds, Integer channelType,
Integer sendStatus) {
return RecordDetailUpdateStatusDTO.builder()
.channelType(channelType)
.oldStatus(NoticeReceiverStatusEnum.INIT.getType())
.newStatus(sendStatus)
.recordDetailIds(recordDetailIds).build();
}
}

View File

@@ -0,0 +1,23 @@
package com.newyetai.usercenter.notice.util;
import com.newyetai.common.constant.CommonConstants;
import com.newyetai.usercenter.userprod.constant.UcMqSelfConstants;
/**
* @author sr on 2020-12-20
*/
public class NoticeSendRecordUtils {
/**
* 根据消息通道获取通道处理mq的routingKey
*
* @param channelType
* @return
* @author sr on 2021-02-04
*/
public static String getNoticeChannelDealKey(Integer channelType) {
return String.join(CommonConstants.UNDERLINE,
UcMqSelfConstants.ROUTING_KEY_NOTICE_CHANNEL_DEAL_PREFIX, channelType.toString());
}
}