package com.xy.service;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xy.dto.MsgUserMessageDto;
import com.xy.entity.MsgSysMonitorNotice;
import com.xy.entity.MsgUserMessage;
import com.xy.enums.MsgReadStatus;
import com.xy.enums.MsgType;
import com.xy.mapper.MsgUserMessageMapper;
import com.xy.utils.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static com.xy.utils.Beans.copy;
import static com.xy.utils.PlusBeans.toIPage;
import static com.xy.utils.PlusBeans.toPageBean;
/**
*
* 服务实现类
*
*
* @author 谭斌
* @since 2023-02-24
*/
@Service
@AllArgsConstructor
@Api(tags = "用户消息")
public class MsgUserMessageServiceImpl extends ServiceImpl implements MsgUserMessageService {
private MsgSysMonitorNoticeServiceImpl msgSysMonitorNoticeService;
@Override
@ApiOperation("消息详情")
public R obj(MsgUserMessageDto.Vo vo) {
MsgUserMessageDto.SelectList selectList = copy(MsgUserMessageDto.SelectList.class, vo);
List list = list(selectList).getData();
MsgUserMessageDto.Vo myMsg = new MsgUserMessageDto.Vo();
if (Emptys.check(list)) {
myMsg = list.get(0);
//更新已读
MsgUserMessage msgUserMessage = new MsgUserMessage();
msgUserMessage.setId(myMsg.getId()).setReadState(MsgReadStatus.READ.getCode().toString());
if (ObjectUtil.isNotEmpty(myMsg)) {
Integer msgId = myMsg.getMsgId();
MsgSysMonitorNotice msgSysMonitorNotice = msgSysMonitorNoticeService.getById(msgId);
if (ObjectUtil.isNotEmpty(msgSysMonitorNotice)) {
myMsg.setContent(msgSysMonitorNotice.getContent());
myMsg.setTitle(msgSysMonitorNotice.getTitle());
}
}
this.updateById(msgUserMessage);
return R.ok(myMsg);
}
return R.ok(myMsg);
}
public R> list(MsgUserMessageDto.SelectList selectList) {
LambdaQueryWrapper lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(selectList, MsgUserMessage.class).build();
List list = list(lambdaQueryWrapper);
return R.ok(copy(MsgUserMessageDto.Vo.class, list));
}
@ApiOperation("我的消息-弹窗提示")
@PostMapping("myMsgPopUp")
public R> myMsgPopUp() {
List voList = new ArrayList<>();
LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(MsgUserMessage::getReadState, MsgReadStatus.UN_READ.getCode());
lambdaQueryWrapper.eq(MsgUserMessage::getUserId, AuthorizeUtils.getLoginId(Long.class));
lambdaQueryWrapper.eq(MsgUserMessage::getPopUp, Boolean.TRUE);
List list = this.list(lambdaQueryWrapper);
if (CollUtil.isEmpty(list)) {
return R.ok(voList);
}
List msgList = BeanUtil.copyToList(list, MsgUserMessageDto.Vo.class);
List msgIds = list.stream().map(MsgUserMessage::getMsgId).collect(Collectors.toList());
List msgSysMonitorNotices = msgSysMonitorNoticeService.listByIds(msgIds);
if (CollUtil.isNotEmpty(msgSysMonitorNotices)) {
Map msgSysMonitorNoticeMap = msgSysMonitorNotices.stream().collect(Collectors.toMap(MsgSysMonitorNotice::getMsgId, i -> i));
for (MsgUserMessageDto.Vo record : msgList) {
Integer msgId = record.getMsgId();
MsgSysMonitorNotice msgSysMonitorNotice = msgSysMonitorNoticeMap.get(msgId);
if (msgSysMonitorNotice != null) {
record.setContent(msgSysMonitorNotice.getContent());
record.setTitle(msgSysMonitorNotice.getTitle());
}
}
}
return R.ok(msgList);
}
@ApiOperation("我的消息-标记已读")
@PostMapping("readById")
public R readById(@RequestBody MsgUserMessageDto.ReadOver dto) {
List ids = dto.getIds();
Long loginId = AuthorizeUtils.getLoginId(Long.class);
List msgUserMessages = this.list(Wrappers.lambdaQuery()
.eq(MsgUserMessage::getUserId, loginId)
.in(MsgUserMessage::getId, ids)
.eq(MsgUserMessage::getReadState, MsgReadStatus.UN_READ.getCode()));
if (CollUtil.isNotEmpty(msgUserMessages)) {
msgUserMessages.forEach(mum -> {
mum.setReadState(String.valueOf(MsgReadStatus.READ.getCode()));
});
this.saveOrUpdateBatch(msgUserMessages);
}
return R.ok(Boolean.TRUE);
}
@ApiOperation("我的消息-未读数量")
@Override
public R myMsgUnRead() {
long count = this.count(Wrappers.lambdaQuery()
.eq(MsgUserMessage::getUserId, AuthorizeUtils.getLoginId(Long.class))
.eq(MsgUserMessage::getReadState, MsgReadStatus.UN_READ.getCode()));
return R.ok(count);
}
@ApiOperation("我的消息-标记全部已读")
@Override
public R readAll() {
Long loginId = AuthorizeUtils.getLoginId(Long.class);
List list = this.list(Wrappers.lambdaQuery()
.eq(MsgUserMessage::getUserId, loginId)
.eq(MsgUserMessage::getReadState, MsgReadStatus.UN_READ.getCode()));
if (CollUtil.isNotEmpty(list)) {
list.forEach(mum -> {
mum.setReadState(String.valueOf(MsgReadStatus.READ.getCode()));
});
this.saveOrUpdateBatch(list);
}
return R.ok(Boolean.TRUE);
}
@ApiOperation("我的未读消息统计")
@Override
public R myMsgPageCount(MsgUserMessageDto.Page page) {
page.setReadState(MsgReadStatus.UN_READ.getCode().toString());
page.setType(null);
Integer allNum = getTotalMsgNum(myMsgPage(page));
//类型 1故障通知、2交易通知、3其他通知
page.setType("1");
Integer riskNum = getTotalMsgNum(myMsgPage(page));
page.setType("2");
Integer tradeNum = getTotalMsgNum(myMsgPage(page));
//其他
page.setType("3");
Integer otherNum = getTotalMsgNum(myMsgPage(page));
//费用
page.setType("4");
Integer costNum = getTotalMsgNum(myMsgPage(page));
MsgUserMessageDto.PageCount pageCount = new MsgUserMessageDto.PageCount()
.setAllNum(allNum)
.setOtherNum(otherNum)
.setRiskNum(riskNum)
.setCostNum(costNum)
.setTradeNum(tradeNum);
return R.ok(pageCount);
}
private Integer getTotalMsgNum(R> pageBeanR) {
PageBean pageBeanRData = pageBeanR.getData();
Long total = pageBeanRData.getTotal();
return total.intValue();
}
@ApiOperation("我的消息")
@Override
public R> myMsgPage(MsgUserMessageDto.Page page) {
//类型 1故障通知、2交易通知、3其他通知
String type = page.getType();
List msgTypes = new ArrayList<>();
List msgTypesNotIn = new ArrayList<>();
if ("1".equals(type)) {
msgTypes.add(MsgType.TYPE6.getCode());
}
if ("2".equals(type)) {
msgTypes.add(MsgType.TYPE8.getCode());
}
//费用
if ("4".equals(type)) {
msgTypes.add(MsgType.TYPE9.getCode());
}
if ("3".equals(type)) {
msgTypesNotIn.add(MsgType.TYPE6.getCode());
msgTypesNotIn.add(MsgType.TYPE8.getCode());
}
page.setUserId(AuthorizeUtils.getLoginId(Long.class));
PageBean pageBean = page.getPage();
LambdaQueryWrapper lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(page, MsgUserMessage.class)
.ge(MsgUserMessage::getCreateTime, page.getBeginCreateTime())
.le(MsgUserMessage::getCreateTime, page.getEndCreateTime())
.build()
.in(CollUtil.isNotEmpty(msgTypes), MsgUserMessage::getMsgType, msgTypes)
.notIn(CollUtil.isNotEmpty(msgTypesNotIn), MsgUserMessage::getMsgType, msgTypesNotIn)
.orderByDesc(MsgUserMessage::getCreateTime);
IPage iPage = page(toIPage(pageBean), lambdaQueryWrapper);
PageBean pageVo = toPageBean(MsgUserMessageDto.PageVO.class, iPage);
List records = pageVo.getRecords();
if (CollUtil.isNotEmpty(records)) {
List msgIds = records.stream().map(MsgUserMessageDto.PageVO::getMsgId).collect(Collectors.toList());
List msgSysMonitorNotices = msgSysMonitorNoticeService.listByIds(msgIds);
if (CollUtil.isNotEmpty(msgSysMonitorNotices)) {
Map msgSysMonitorNoticeMap = msgSysMonitorNotices.stream().collect(Collectors.toMap(MsgSysMonitorNotice::getMsgId, i -> i));
for (MsgUserMessageDto.PageVO record : records) {
Integer msgId = record.getMsgId();
MsgSysMonitorNotice msgSysMonitorNotice = msgSysMonitorNoticeMap.get(msgId);
if (msgSysMonitorNotice != null) {
record.setContent(msgSysMonitorNotice.getContent());
record.setTitle(msgSysMonitorNotice.getTitle());
}
}
}
}
return R.ok(pageVo);
}
@ApiOperation("新增我的消息")
@Override
public R save(@RequestBody @Validated MsgUserMessageDto.Save save) {
MsgUserMessage saveInfo = Beans.copy(MsgUserMessage.class, save);
save(saveInfo);
return R.ok();
}
@ApiOperation("更新")
@Override
public R update(@RequestBody @Validated MsgUserMessageDto.Update update) {
MsgUserMessage updateInfo = Beans.copy(MsgUserMessage.class, update);
updateById(updateInfo);
return R.ok();
}
}