自研的通知功能业务逻辑代码优化版(全)
/**
* @author lzq
* @date 2019/12/31
*/
@Service
public class MessageService {
private static final Logger logger = LoggerFactory.getLogger(MessageService.class);
@Autowired
private TabMessageMapper messageMapper;
@Autowired
private MapperService mapperService;
@Autowired
private ClientUserService clientUserService;
/**
* 批量删除通知
*/
public void batchDelete(List<String> ids) {
TabMessageExample tabMessageExample = new TabMessageExample();
tabMessageExample.createCriteria().andIdIn(ids);
messageMapper.deleteByExample(tabMessageExample);
}
/**
* 添加通知
*/
public void save(String receiveId, MessageBody messageBody){
try {
TabMessage tabMessage = new TabMessage();
tabMessage.setId(UuidUtils.getUuid());
tabMessage.setReceiveId(receiveId);
// operationId 指的是操作Id:任务编号/交易编号
tabMessage.setOperationId(messageBody.getOperationId());
tabMessage.setMessageTitle(messageBody.getMessageTitle());
tabMessage.setMessageType(messageBody.getMessageType());
tabMessage.setStatus(messageBody.getMessageStatus());
// messageContent属性为通知内容,以下是场景意义
// 1,公告信息直接就是信息主体内容
// 2,系统通知就是操作结果当前标态(待审核、审核通过、驳回/已完成、部分完成、待支付、异常/鉴权、锁定/充值到账/提现完成等)
// 3, 提现、充值通知带账户余额,用"-"拼接:内容(操作结果当前标态)与余额
if (messageBody.getMessageContent().equals("") || messageBody.getMessageContent() == null) {
tabMessage.setMessageContent(MessageCommon.NOTICE);
} else {
tabMessage.setMessageContent(messageBody.getMessageContent());
}
tabMessage.setCreateAt(new Date());
tabMessage.setUpdateAt(new Date());
messageMapper.insertSelective(tabMessage);
} catch (Exception e) {
logger.error("新增出错");
}
}
/**
* 用户查询系统通知
* 各个类型的全部消息
*/
public QueryResult<List<TabMessage>> getBaseMessage(Integer scope, String sort, String orderBy, Integer offset, Integer limit, SpringInstUserEntity userEntity) throws Exception {
Page page = PageHelper.offsetPage(offset, limit).setOrderBy(orderBy + " " + sort);
TabMessageExample tabMessageExample = new TabMessageExample();
TabMessageExample.Criteria messageCriteria = tabMessageExample.createCriteria();
LoginUser loginUser = clientUserService.preLoginUser(userEntity);
List<Integer> codeList = Arrays.asList(InstitutionTypeEnum.CORP.getCode(),InstitutionTypeEnum.PLAT.getCode());
if(codeList.contains(loginUser.getIdentity())){
messageCriteria.andReceiveIdEqualTo(loginUser.getCorporation().getId());
}
if (scope == MessageStatusEnum.UN_READ.getCode() || scope == MessageStatusEnum.READ_FINISH.getCode()) {
messageCriteria.andStatusEqualTo(scope);
}
List<TabMessage> messageList = messageMapper.selectByExample(tabMessageExample).stream().
sorted(Comparator.comparing(TabMessage::getCreateAt).reversed()).collect(Collectors.toList());
return new QueryResult<>((int) page.getTotal(), offset, limit, messageList);
}
/**
* 用户查看具体的通知信息
* messageContent属性为通知内容,以下是场景意义
* 1,公告信息直接就是信息主体内容
* 2,系统通知就是操作结果当前标态(待审核、审核通过、驳回/已完成、部分完成、异常/充值到账-余额/提现完成-余额等)
*/
@Transactional(rollbackFor = Exception.class)
public MessageResponseBody getDetailMessage(String messageId, SpringInstUserEntity userEntity) throws ApiException {
LoginUser loginUser = clientUserService.preLoginUser(userEntity);
TabMessageExample tabMessageExample = new TabMessageExample();
tabMessageExample.createCriteria().andIdEqualTo(messageId);
List<TabMessage> messageList = messageMapper.selectByExample(tabMessageExample);
MessageResponseBody responseBody = new MessageResponseBody();
if (CollectionUtils.isNotEmpty(messageList)) {
TabMessage tabMessage = messageList.get(0);
responseBody.setMessageId(tabMessage.getId());
responseBody.setMessageStatus(tabMessage.getStatus());
responseBody.setMessageTitle(tabMessage.getMessageTitle());
responseBody.setMessageType(tabMessage.getMessageType());
responseBody.setMessageTime(tabMessage.getCreateAt());
// messageContent属性为通知内容,以下是场景意义
// 1,公告信息直接就是信息主体内容
// 2,系统通知就是操作结果当前标态(待审核、审核通过、驳回/已完成、部分完成、异常/充值到账-余额/提现完成-余额等)
responseBody.setMessageContent(tabMessage.getMessageContent());
// 消息通知为任务、开票、支付系列--查询任务表
if (tabMessage.getMessageType() == MessageTypeEnum.TASK.getCode()
|| tabMessage.getMessageType() == MessageTypeEnum.OPEN_TICKET.getCode()
|| tabMessage.getMessageType() == MessageTypeEnum.PAY_CHARGE.getCode()) {
TabTask tabTask = mapperService.getTaskByNo(tabMessage.getOperationId());
// OperationId为任务编号,任务系列需返回值/提现充值不需要
responseBody.setTaskNo(tabMessage.getOperationId());
// 判断用户公司类型
// 平台公司
if (loginUser.getIdentity() == InstitutionTypeEnum.PLAT.getCode()) {
responseBody.setMessageStartCorp(tabTask.getCorpId());
responseBody.setMessageEndCorp(tabTask.getPlatCorpId());
} else if (loginUser.getIdentity() == InstitutionTypeEnum.CORP.getCode()) {
responseBody.setMessageStartCorp(tabTask.getPlatCorpId());
responseBody.setMessageEndCorp(tabTask.getCorpId());
} else {
if (tabTask.getCorpId().equals(tabMessage.getReceiveId())) {
responseBody.setMessageStartCorp(tabTask.getPlatCorpId());
} else {
responseBody.setMessageStartCorp(tabTask.getCorpId());
}
responseBody.setMessageEndCorp(tabMessage.getReceiveId());
}
// 支付的完成支付金额与任务和开票的综合服务费为同一个值
responseBody.setServiceCharge(tabTask.getPayAmount());
// 任务、开票的申请时间/支付的打款时间
responseBody.setTaskApplyDateTime(tabTask.getCreateAt());
// 任务、开票的审核通过时间/支付的完成时间
if (MessageCommon.applyPassValue.equals(tabMessage.getMessageContent())
|| MessageCommon.PAY_FINISHED.equals(tabMessage.getMessageContent())) {
responseBody.setTaskPassDateTime(tabMessage.getCreateAt());
}
// 其他通知类型(充值,提现,鉴权等交易)--查询交易表
} else {
List<TabTransaction> transactionList = mapperService.getTransactionByTxnId(tabMessage.getOperationId());
if (CollectionUtils.isNotEmpty(transactionList)) {
TabTransaction tabTransaction = transactionList.get(0);
// checkUserType
// 始为商户
responseBody.setMessageStartCorp(tabTransaction.getCorpId());
// 终为接收
responseBody.setMessageEndCorp(tabMessage.getReceiveId());
// 充值,提现开始时间--交易创建的时间
responseBody.setTaskApplyDateTime(tabTransaction.getCreateAt());
// 充值到账、提现完成时间--通知创建时间
responseBody.setTaskPassDateTime(tabMessage.getCreateAt());
// 提现,充值成功之后的账户余额
responseBody.setAccountBalance(tabMessage.getMessageContent().split("-")[1]);
// 提现、充值综合服务费
responseBody.setServiceCharge(tabTransaction.getPayAmount());
}
}
}
return responseBody;
}
/**
* 获取最新10条数据
* 用于主页切换显示\服务用户功能
* 先按最新时间展示未读消息
* 若未读消息小于10
* 往后补上已读消息凑满10条
*/
public List<TabMessage> getNewestTenMessage(SpringInstUserEntity userEntity) throws Exception {
LoginUser loginUser = clientUserService.preLoginUser(userEntity);
TabMessageExample tabMessageExample = new TabMessageExample();
tabMessageExample.createCriteria().andReceiveIdEqualTo(loginUser.getCorporation().getId())
.andStatusEqualTo(MessageStatusEnum.UN_READ.getCode());
// 按通知的最新进行排序
List<TabMessage> tabMessageList = messageMapper.selectByExample(tabMessageExample).stream()
.sorted(Comparator.comparing(TabMessage::getCreateAt).reversed()).collect(Collectors.toList());
List<TabMessage> newTenMessageList = new ArrayList<>(MessageCommon.SWITCH_MESSAGE_MAX);
// 当未读`消息小于10条时,取已读筹凑满10条;否则取10条
int listNum = tabMessageList.size();
if (listNum < MessageCommon.SWITCH_MESSAGE_MAX) {
newTenMessageList.addAll(tabMessageList);
TabMessageExample tabMessageExampleFinish = new TabMessageExample();
tabMessageExampleFinish.createCriteria().andReceiveIdEqualTo(loginUser.getCorporation().getId())
.andStatusEqualTo(MessageStatusEnum.READ_FINISH.getCode());
// 已读
List<TabMessage> finishMessageList = messageMapper.selectByExample(tabMessageExampleFinish).stream()
.sorted(Comparator.comparing(TabMessage::getCreateAt).reversed()).collect(Collectors.toList());
// 未或刚凑满
if(finishMessageList.size() <= MessageCommon.SWITCH_MESSAGE_MAX - listNum){
newTenMessageList.addAll(finishMessageList);
}else{
newTenMessageList.addAll(finishMessageList.subList(0,MessageCommon.SWITCH_MESSAGE_MAX - listNum));
}
} else {
newTenMessageList.addAll(newTenMessageList.subList(0,MessageCommon.SWITCH_MESSAGE_MAX));
}
return newTenMessageList;
}
/**
* 根据指定id获取一条通知
*/
public TabMessage getOneMessage(String id){
TabMessageExample tabMessageExample = new TabMessageExample();
tabMessageExample.createCriteria().andIdEqualTo(id);
List<TabMessage> tabMessageList = messageMapper.selectByExample(tabMessageExample);
if(CollectionUtils.isNotEmpty(tabMessageList)){
return tabMessageList.get(0);
}
return null;
}
/**
* 更改信息的状态为已读
*/
public void updateMessage(SpringInstUserEntity userEntity,TabMessage tabMessage) throws Exception{
LoginUser loginUser = clientUserService.preLoginUser(userEntity);
List<Integer> codeList = Arrays.asList(InstitutionTypeEnum.PLAT.getCode(),InstitutionTypeEnum.CORP.getCode());
if(codeList.contains(loginUser.getIdentity())) {
tabMessage.setStatus(MessageStatusEnum.READ_FINISH.getCode());
messageMapper.updateByPrimaryKeySelective(tabMessage);
}else {
logger.info("管理员读取信息不需要更新信息为已读");
}
}
}