package com.xjrsoft.module.oa.controller;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.xjrsoft.common.constant.GlobalConstant;
import com.xjrsoft.common.enums.DeleteMark;
import com.xjrsoft.common.model.result.RT;
import com.xjrsoft.common.page.ConventPage;
import com.xjrsoft.common.page.PageOutput;
import com.xjrsoft.common.utils.VoToColumnUtil;
import com.xjrsoft.module.oa.dto.*;
import com.xjrsoft.module.oa.entity.News;
import com.xjrsoft.module.oa.entity.NewsAppendix;
import com.xjrsoft.module.oa.entity.NewsRelation;
import com.xjrsoft.module.oa.entity.NewsRelationConfig;
import com.xjrsoft.module.oa.service.INewsAppendixService;
import com.xjrsoft.module.oa.service.INewsRelationConfigService;
import com.xjrsoft.module.oa.service.INewsRelationService;
import com.xjrsoft.module.oa.service.INewsService;
import com.xjrsoft.module.oa.vo.*;
import com.xjrsoft.module.system.entity.File;
import com.xjrsoft.module.teacher.entity.XjrUser;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.BooleanUtils;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
/**
*
* 新闻中心表 前端控制器
*
*
* @author zlf
* @since 2022-06-16
*/
@RestController
@RequestMapping(GlobalConstant.OA_MODULE_PREFIX + "/news")
@Api(value = GlobalConstant.OA_MODULE_PREFIX + "/news", tags = "新闻公告")
@AllArgsConstructor
public class NewsController {
private INewsService newsService;
private INewsRelationService newsRelationService;
private INewsAppendixService newsAppendixService;
private INewsRelationConfigService newsRelationConfigService;
@GetMapping
@ApiOperation(value = "获取新闻分页")
public RT> page(NewsPageDto dto) {
Wrapper wrapper = Wrappers.query().lambda()
.eq(News::getTypeId, dto.getType())
.like(StrUtil.isNotBlank(dto.getKeyword()), News::getFullHead, dto.getKeyword())
.select(News.class, x -> VoToColumnUtil.fieldsToColumns(NewsPageVo.class).contains(x.getProperty()))
.orderByDesc(News::getSendEndDate);
IPage page = newsService.page(ConventPage.getPage(dto), wrapper);
PageOutput pageOutput = ConventPage.getPageOutput(page, NewsPageVo.class);
return RT.ok(pageOutput);
}
@GetMapping("/manage-box")
@ApiOperation(value = "获取管理新闻分页")
public RT> manageBox(NewsPageDto dto) {
IPage page = newsService.manageBox(dto);
PageOutput pageOutput = ConventPage.getPageOutput(page, NewsPageVo.class);
return RT.ok(pageOutput);
}
@GetMapping("/receipt-box")
@ApiOperation(value = "获取接受新闻分页")
public RT> receiptBox(NewsPageDto dto) {
IPage page = newsService.receiptBox(dto);
PageOutput pageOutput = ConventPage.getPageOutput(page, NewsPageVo.class);
return RT.ok(pageOutput);
}
@PostMapping
@ApiOperation(value = "新增新闻")
public RT add(@RequestBody AddNewsDto addNewsDto) {
return RT.ok(newsService.add(addNewsDto));
}
@GetMapping(value = "/info")
@ApiOperation(value = "新闻详情")
public RT info(@RequestParam Long id, @RequestParam(required = false) Boolean isRead) {
News news = newsService.getById(id);
if (news == null) {
RT.error("找不到此新闻!");
}
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
queryWrapper
.eq(NewsRelation::getNewsId , id)
.select(NewsRelation.class, x -> VoToColumnUtil.fieldsToColumns(NewsRelation.class).contains(x.getProperty()));
List newsRelationVoList = new ArrayList<>();
if(ObjectUtil.isNotNull(news.getCreateUserId()) && StpUtil.getLoginIdAsLong() == news.getCreateUserId()){
List newsRelationList = newsRelationService.list(queryWrapper);
newsRelationList.stream().forEach(element -> {
// 对元素进行操作
NewsRelationVo newsRelationVo = BeanUtil.toBean(element, NewsRelationVo.class);
newsRelationVoList.add(newsRelationVo);
});
}else{
queryWrapper.eq(NewsRelation::getUserId , StpUtil.getLoginIdAsLong());
NewsRelation newsRelation = newsRelationService.getOne(queryWrapper);
NewsRelationVo newsRelationVo = BeanUtil.toBean(newsRelation, NewsRelationVo.class);
newsRelationVoList.add(newsRelationVo);
}
NewsVo newsVo = BeanUtil.toBean(news, NewsVo.class);
newsVo.setRelationList(newsRelationVoList);
if (BooleanUtils.isTrue(isRead)) {
// NewsRelation newsRelation = new NewsRelation();
// newsRelation.setNewsId(id);
// newsRelation.setUserId(StpUtil.getLoginIdAsLong());
// newsRelationService.remove(Wrappers.query().lambda()
// .eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong())
// .eq(NewsRelation::getNewsId, id));
// newsRelationService.save(newsRelation);
}
// List newsRelationVoList = newsRelationService.selectJoinList(NewsRelationVo.class,
// new MPJLambdaWrapper()
// .eq(NewsRelation::getNewsId, id)
// .select(NewsRelation::getId)
// .select(NewsRelation.class, x -> VoToColumnUtil.fieldsToColumns(NewsRelationVo.class).contains(x.getProperty()))
// .leftJoin(XjrUser.class, XjrUser::getId, NewsRelation::getUserId, ext -> ext.selectAs(XjrUser::getName, NewsRelationVo::getUserName)));
// if (newsRelationVoList.size() > 0) {
// newsVo.setRelationList(newsRelationVoList);
// }
List newsAppendixVoList = newsAppendixService.selectJoinList(NewsAppendixVo.class,
new MPJLambdaWrapper().eq(NewsAppendix::getNewsId, id)
.select(NewsRelation::getId)
.select(NewsAppendix.class, x -> VoToColumnUtil.fieldsToColumns(NewsAppendixVo.class).contains(x.getProperty()))
.leftJoin(File.class, File::getId, NewsAppendix::getFileId, ext -> ext.selectAs(File::getFileName, NewsAppendixVo::getFileName)
.selectAs(File::getFolderId, NewsAppendixVo::getFolderId)
.selectAs(File::getFileUrl, NewsAppendixVo::getFileUrl))
);
if (newsAppendixVoList.size() > 0) {
newsVo.setAppendixList(newsAppendixVoList);
}
return RT.ok(newsVo);
}
@PutMapping
@ApiOperation(value = "修改新闻")
public RT update(@RequestBody UpdateNewsDto updateNewsDto) {
//News news = BeanUtil.toBean(updateNewsDto, News.class);
return RT.ok(newsService.update(updateNewsDto));
}
@DeleteMapping
@ApiOperation(value = "删除新闻")
public RT delete(@RequestBody List ids) {
return RT.ok(newsService.delete(ids));
}
@PutMapping("/change-status")
@ApiOperation(value = "发布或下架新闻")
public RT changeStatus(@RequestBody ChangeNewsDto changeNewsDto) throws Exception {
News xjrNews = newsService.getById(changeNewsDto.getId());
if (changeNewsDto.getStatus() == null || xjrNews == null) {
throw new Exception("参数异常");
}
if (changeNewsDto.getStatus().equals(xjrNews.getStatus())) {
if (changeNewsDto.getStatus() == 2) {
throw new Exception("新闻已发布!!!");
} else if (changeNewsDto.getStatus() == 3) {
throw new Exception("新闻已下架!!!");
}
}
//将原来的修改enabled_mark改为修改status
xjrNews.setStatus(changeNewsDto.getStatus());
if(xjrNews.getStatus() == 2){
newsService.SendMessage(xjrNews.getId());
}
return RT.ok(newsService.updateById(xjrNews));
}
@PutMapping("/read")
@ApiOperation(value = "读新闻")
public RT read(@RequestBody List ids) {
List toSaveList = newsRelationService.list(
Wrappers.query().lambda()
.in(NewsRelation::getNewsId, ids)
.eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong()));
for (NewsRelation newsRelation : toSaveList) {
newsRelation.setReadMark(1);
newsRelation.setReadDate(LocalDateTime.now());
}
// newsRelationService.remove(Wrappers.query().lambda()
// .in(NewsRelation::getNewsId, ids)
// .eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong()));
return RT.ok(newsRelationService.updateBatchById(toSaveList));
}
@PutMapping("/reply")
@ApiOperation(value = "新闻回复")
public RT reply(@RequestBody NewsReplyDto newsReplyDto) {
NewsRelation newsRelation = newsRelationService.getOne(
Wrappers.query().lambda()
.eq(NewsRelation::getNewsId, newsReplyDto.getId())
.eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong()));
if (newsRelation == null) {
newsRelation = new NewsRelation();
newsRelation.setNewsId(newsReplyDto.getId());
newsRelation.setUserId(StpUtil.getLoginIdAsLong());
newsRelation.setReadMark(1);
newsRelation.setReadDate(LocalDateTime.now());
newsRelation.setReplyContent(newsReplyDto.getReplyContent());
return RT.ok(newsRelationService.save(newsRelation));
}
if (newsRelation.getReadMark() == null || newsRelation.getReadMark() == 0) {
newsRelation.setReadMark(1);
newsRelation.setReadDate(LocalDateTime.now());
}
newsRelation.setReplyContent(newsReplyDto.getReplyContent());
return RT.ok(newsRelationService.updateById(newsRelation));
}
@GetMapping("/page-relation")
@ApiOperation(value = "获取新闻阅读权限分页")
public RT> pageRelation(NewsRelationPageDto dto) {
IPage page = newsRelationService.selectJoinListPage(ConventPage.getPage(dto), NewsRelationVo.class,
new MPJLambdaWrapper()
.eq(NewsRelation::getNewsId, dto.getNewsId())
.eq(ObjectUtil.isNotEmpty(dto.getReadMark()) && dto.getReadMark() > 0, NewsRelation::getReadMark, dto.getReadMark() == 1 ? 0 : 1)
.isNull(ObjectUtil.isNotEmpty(dto.getReplyMark()) && dto.getReplyMark() == 1, NewsRelation::getReplyContent)
.isNotNull(ObjectUtil.isNotEmpty(dto.getReplyMark()) && dto.getReplyMark() == 2, NewsRelation::getReplyContent)
.select(NewsRelation::getId)
.select(NewsRelation.class, x -> VoToColumnUtil.fieldsToColumns(NewsRelationVo.class).contains(x.getProperty()))
.leftJoin(XjrUser.class, XjrUser::getId, NewsRelation::getUserId, ext -> ext.selectAs(XjrUser::getName, NewsRelationVo::getUserName))
);
PageOutput pageOutput = ConventPage.getPageOutput(page);
return RT.ok(pageOutput);
}
@GetMapping("/page-relation-config")
@ApiOperation(value = "获取新闻权限分页")
public RT> pageRelationConfig(NewsRelationPageDto dto) {
Wrapper wrapper = Wrappers.query().lambda()
.eq(NewsRelationConfig::getNewsId, dto.getNewsId())
.select(NewsRelationConfig.class, x -> VoToColumnUtil.fieldsToColumns(NewsRelationConfigVo.class).contains(x.getProperty()));
IPage page = newsRelationConfigService.page(ConventPage.getPage(dto), wrapper);
PageOutput pageOutput = ConventPage.getPageOutput(page, NewsRelationConfigVo.class);
return RT.ok(pageOutput);
}
@GetMapping("/count-relation")
@ApiOperation(value = "新闻阅读权限统计")
public RT countRelation(@RequestParam Long id) {
Long total = newsRelationService.count(Wrappers.query().lambda().eq(NewsRelation::getNewsId, id));
Long notRead = newsRelationService.count(Wrappers.query().lambda().eq(NewsRelation::getNewsId, id).eq(NewsRelation::getReadMark, 0));
Long isRead = newsRelationService.count(Wrappers.query().lambda().eq(NewsRelation::getNewsId, id).eq(NewsRelation::getReadMark, 1));
Long isReply = newsRelationService.count(Wrappers.query().lambda().eq(NewsRelation::getNewsId, id).isNull(NewsRelation::getReplyContent));
Long notReply = newsRelationService.count(Wrappers.query().lambda().eq(NewsRelation::getNewsId, id).isNotNull(NewsRelation::getReplyContent));
Long[] arrayRefVar = {total, notRead, isRead, isReply, notReply};
return RT.ok(arrayRefVar);
}
@PutMapping("/update-relation")
@ApiOperation(value = "设置新闻阅读权限")
public RT updateRelation(@RequestBody UpdateNewsRelationDto updateRelationDto) {
return RT.ok(newsService.updateRelation(updateRelationDto));
}
@DeleteMapping("/delete-relation")
@ApiOperation(value = "删除新闻阅读权限")
public RT deleteRelation(@RequestBody DeleteNewsRelationDto deleteNewsRelationDto) {
return RT.ok(newsService.deleteRelation(deleteNewsRelationDto));
}
@GetMapping("/count-type")
@ApiOperation(value = "未读类型统计")
public RT> countType() {
List newsCountTypeVoList = new ArrayList<>();
Integer typeIds[] = {1, 2, 3};
for (Integer typeId : typeIds) {
Long totalType = newsRelationService.count(Wrappers.query().lambda().eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong()).eq(NewsRelation::getReadMark, 0).in(NewsRelation::getNewsId, "SELECT id from xjr_oa_news where type_id=" + typeId));
NewsCountTypeVo newsCountTypeVo = new NewsCountTypeVo();
newsCountTypeVo.setTypeId(typeId);
newsCountTypeVo.setTotal(totalType);
News news = new News();
if(typeId == 1){
news = newsService.getOne(Wrappers.query().lambda().eq(News::getTypeId, typeId).orderByDesc(News::getReleaseTime).last("limit 1"));
}
if(typeId == 2){
news = newsService.selectJoinOne(News.class,
new MPJLambdaWrapper()
.disableSubLogicDel()
.eq(News::getTypeId, typeId)
.eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong())
.orderByDesc(News::getReleaseTime)
.last("limit 1")
.innerJoin(NewsRelation.class, NewsRelation::getNewsId, News::getId));
}
if (news != null) {
newsCountTypeVo.setTime(news.getReleaseTime());
newsCountTypeVo.setTitle(news.getBriefHead());
}
newsCountTypeVoList.add(newsCountTypeVo);
}
return RT.ok(newsCountTypeVoList);
}
@GetMapping("/send-message")
@ApiOperation(value = "发送消息")
public RT sendMessage(@RequestParam Long id) {
return RT.ok(newsService.SendMessage(id));
}
@GetMapping("/unread-count")
@ApiOperation(value = "获取登录人未读消息数量")
public RT unreadCount() {
Integer count = newsService.selectJoinCount(
new MPJLambdaWrapper()
.eq(NewsRelation::getReadMark, 0)
.eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong())
.eq(News::getDeleteMark, DeleteMark.NODELETE.getCode())
.innerJoin(NewsRelation.class, NewsRelation::getNewsId, News::getId)
);
return RT.ok(count);
}
}