diff --git a/pmapi/pom.xml b/pmapi/pom.xml index b6b2ebf..bbc5acf 100644 --- a/pmapi/pom.xml +++ b/pmapi/pom.xml @@ -253,6 +253,11 @@ easyexcel-core 3.1.2 + + com.ningdatech + nd-file-starter + 1.0.0 + diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/common/utils/BizUtils.java b/pmapi/src/main/java/com/ningdatech/pmapi/common/utils/BizUtils.java new file mode 100644 index 0000000..fd5eb4e --- /dev/null +++ b/pmapi/src/main/java/com/ningdatech/pmapi/common/utils/BizUtils.java @@ -0,0 +1,39 @@ +package com.ningdatech.pmapi.common.utils; + +import cn.hutool.core.util.StrUtil; +import com.ningdatech.basic.util.StrPool; +import org.springframework.util.NumberUtils; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +/** + *

+ * BizUtils + *

+ * + * @author WendyYang + * @since 17:32 2023/1/29 + */ +public class BizUtils { + + private BizUtils() { + + } + + public static List splitToNum(String str, Class aClass) { + if (StrUtil.isEmpty(str)) { + return Collections.emptyList(); + } + return Arrays.stream(str.split(StrPool.COMMA)) + .map(w -> NumberUtils.parseNumber(w, aClass)) + .collect(Collectors.toList()); + } + + public static List splitToLong(String str) { + return splitToNum(str, Long.class); + } + +} diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/sys/controller/NoticeController.java b/pmapi/src/main/java/com/ningdatech/pmapi/sys/controller/NoticeController.java new file mode 100644 index 0000000..ecd4678 --- /dev/null +++ b/pmapi/src/main/java/com/ningdatech/pmapi/sys/controller/NoticeController.java @@ -0,0 +1,70 @@ +package com.ningdatech.pmapi.sys.controller; + +import com.ningdatech.basic.model.IdVo; +import com.ningdatech.basic.model.PageVo; +import com.ningdatech.pmapi.sys.entity.req.NoticeListReq; +import com.ningdatech.pmapi.sys.entity.req.NoticeSaveReq; +import com.ningdatech.pmapi.sys.entity.req.NoticeStatusModifyReq; +import com.ningdatech.pmapi.sys.entity.vo.NoticeDetailVO; +import com.ningdatech.pmapi.sys.entity.vo.NoticeListItemVO; +import com.ningdatech.pmapi.sys.manage.NoticeManage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + +/** + *

+ * 系统通知 前端控制器 + *

+ * + * @author WendyYang + * @since 2022-07-21 + */ +@RestController +@Api(tags = "消息管理") +@RequiredArgsConstructor +@RequestMapping("/api/v1/notice") +public class NoticeController { + + private final NoticeManage noticeManage; + + @PostMapping("/save") + @ApiOperation("新增通知") + public IdVo save(@Valid @RequestBody NoticeSaveReq req) { + return noticeManage.saveOrModify(req); + } + + @GetMapping("/detail/{id}") + @ApiOperation("通知详情") + public NoticeDetailVO save(@PathVariable Long id) { + return noticeManage.detail(id); + } + + @PostMapping("/enabled") + @ApiOperation("启用禁用") + public Boolean save(@Valid @RequestBody NoticeStatusModifyReq req) { + return noticeManage.changeEnabled(req); + } + + @GetMapping("/dashboard/list") + @ApiOperation("工作台公告列表") + public PageVo dashboardList(@RequestParam(required = false, defaultValue = "3") Integer limit) { + return noticeManage.dashboardList(limit); + } + + @GetMapping("/manage/list") + @ApiOperation("公告管理列表") + public PageVo listByManager(NoticeListReq req) { + return noticeManage.listByManager(req); + } + + @DeleteMapping("/del") + @ApiOperation("删除公告") + public void delNotice(@RequestBody IdVo req) { + noticeManage.delNotice(req.getId()); + } + +} diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/sys/entity/Notice.java b/pmapi/src/main/java/com/ningdatech/pmapi/sys/entity/Notice.java new file mode 100644 index 0000000..1e8d750 --- /dev/null +++ b/pmapi/src/main/java/com/ningdatech/pmapi/sys/entity/Notice.java @@ -0,0 +1,68 @@ +package com.ningdatech.pmapi.sys.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 系统通知 + *

+ * + * @author WendyYang + * @since 2022-07-21 + */ +@Data +@TableName("nd_notice") +@ApiModel(value = "SysNotice对象", description = "系统通知") +public class Notice implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("ID") + @TableId(type = IdType.AUTO) + private Long id; + + @ApiModelProperty("消息类型") + private Integer type; + + @ApiModelProperty("标题") + private String title; + + @ApiModelProperty("内容") + private String content; + + @ApiModelProperty("启用禁用") + private Boolean enabled; + + @ApiModelProperty("附件ID") + private String attachment; + + @ApiModelProperty("创建时间") + private LocalDateTime createOn; + + @ApiModelProperty("创建人id") + private Long createBy; + + @ApiModelProperty("最后修改时间") + private LocalDateTime updateOn; + + @ApiModelProperty("最后修改人") + private Long updateBy; + + @ApiModelProperty("是否删除") + @TableLogic + private Boolean deleted; + + @ApiModelProperty("置顶时间") + private LocalDateTime setTopTime; + +} diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/sys/entity/req/NoticeListReq.java b/pmapi/src/main/java/com/ningdatech/pmapi/sys/entity/req/NoticeListReq.java new file mode 100644 index 0000000..e771094 --- /dev/null +++ b/pmapi/src/main/java/com/ningdatech/pmapi/sys/entity/req/NoticeListReq.java @@ -0,0 +1,31 @@ +package com.ningdatech.pmapi.sys.entity.req; + +import com.ningdatech.basic.model.PagePo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * DashboardNoticeListPo + *

+ * + * @author WendyYang + * @since 00:32 2022/7/23 + */ +@Data +@ApiModel("工作台消息列表查询") +@EqualsAndHashCode(callSuper = true) +public class NoticeListReq extends PagePo { + + @ApiModelProperty("消息类型") + private Integer type; + + @ApiModelProperty("公告标题") + private String title; + + @ApiModelProperty("公告状态") + private Boolean enabled; + +} \ No newline at end of file diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/sys/entity/req/NoticeSaveReq.java b/pmapi/src/main/java/com/ningdatech/pmapi/sys/entity/req/NoticeSaveReq.java new file mode 100644 index 0000000..9a5bf52 --- /dev/null +++ b/pmapi/src/main/java/com/ningdatech/pmapi/sys/entity/req/NoticeSaveReq.java @@ -0,0 +1,45 @@ +package com.ningdatech.pmapi.sys.entity.req; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + *

+ * MsgUpdatePo + *

+ * + * @author WendyYang + * @since 21:35 2022/7/21 + */ +@Data +@ApiModel("消息新增实体") +public class NoticeSaveReq { + + @ApiModelProperty("ID") + private Long id; + + @ApiModelProperty("通知标题") + @NotBlank(message = "通知标题不能为空") + private String title; + + @ApiModelProperty("通知类型") + @NotNull(message = "通知类型不能为空") + private Integer type; + + @ApiModelProperty("通知内容") + @NotBlank(message = "通知内容不能为空") + private String content; + + @ApiModelProperty("附件ID编码") + private String attachment; + + @ApiModelProperty("是否启用") + @NotNull(message = "是否启用不能为空") + private Boolean enabled; + +} diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/sys/entity/req/NoticeStatusModifyReq.java b/pmapi/src/main/java/com/ningdatech/pmapi/sys/entity/req/NoticeStatusModifyReq.java new file mode 100644 index 0000000..76632fe --- /dev/null +++ b/pmapi/src/main/java/com/ningdatech/pmapi/sys/entity/req/NoticeStatusModifyReq.java @@ -0,0 +1,29 @@ +package com.ningdatech.pmapi.sys.entity.req; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + *

+ * NoticeStatusUpdatePo + *

+ * + * @author WendyYang + * @since 22:32 2022/7/22 + */ +@Data +@ApiModel("消息状态修改") +public class NoticeStatusModifyReq { + + @ApiModelProperty("ID") + @NotNull(message = "ID不能为空") + private Long id; + + @ApiModelProperty("状态:true 启用、false 停用") + @NotNull(message = "状态不能为空") + private Boolean status; + +} diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/sys/entity/vo/NoticeDetailVO.java b/pmapi/src/main/java/com/ningdatech/pmapi/sys/entity/vo/NoticeDetailVO.java new file mode 100644 index 0000000..2e94174 --- /dev/null +++ b/pmapi/src/main/java/com/ningdatech/pmapi/sys/entity/vo/NoticeDetailVO.java @@ -0,0 +1,40 @@ +package com.ningdatech.pmapi.sys.entity.vo; + +import com.ningdatech.file.entity.vo.result.AttachFileVo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + *

+ * NoticeDetailVo + *

+ * + * @author WendyYang + * @since 16:56 2022/7/22 + */ +@Data +@ApiModel("公告详情") +public class NoticeDetailVO { + + @ApiModelProperty("ID") + private Long id; + + @ApiModelProperty("标题") + private String title; + + @ApiModelProperty("内容") + private String content; + + @ApiModelProperty("状态") + private Boolean enabled; + + @ApiModelProperty("公告类型") + private Integer type; + + @ApiModelProperty("附件信息") + private List attachments; + +} diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/sys/entity/vo/NoticeListItemVO.java b/pmapi/src/main/java/com/ningdatech/pmapi/sys/entity/vo/NoticeListItemVO.java new file mode 100644 index 0000000..d3ef592 --- /dev/null +++ b/pmapi/src/main/java/com/ningdatech/pmapi/sys/entity/vo/NoticeListItemVO.java @@ -0,0 +1,44 @@ +package com.ningdatech.pmapi.sys.entity.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; +import lombok.experimental.Tolerate; + +import java.time.LocalDateTime; + +/** + *

+ * ManageNoticeListItem + *

+ * + * @author WendyYang + * @since 00:30 2022/7/23 + */ +@Data +@Builder +public class NoticeListItemVO { + + @Tolerate + public NoticeListItemVO() { + } + + @ApiModelProperty("公告ID") + private Long id; + + @ApiModelProperty("公告类型") + private Integer type; + + @ApiModelProperty("标题") + private String title; + + @ApiModelProperty("创建时间") + private LocalDateTime createOn; + + @ApiModelProperty("是否启用") + private Boolean enabled; + + @ApiModelProperty("是否置顶") + private Boolean topped; + +} \ No newline at end of file diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/sys/manage/NoticeManage.java b/pmapi/src/main/java/com/ningdatech/pmapi/sys/manage/NoticeManage.java new file mode 100644 index 0000000..5961508 --- /dev/null +++ b/pmapi/src/main/java/com/ningdatech/pmapi/sys/manage/NoticeManage.java @@ -0,0 +1,99 @@ +package com.ningdatech.pmapi.sys.manage; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ningdatech.basic.model.IdVo; +import com.ningdatech.basic.model.PageVo; +import com.ningdatech.basic.util.CollUtils; +import com.ningdatech.file.entity.vo.result.AttachFileVo; +import com.ningdatech.file.service.FileService; +import com.ningdatech.pmapi.common.utils.BizUtils; +import com.ningdatech.pmapi.sys.entity.Notice; +import com.ningdatech.pmapi.sys.entity.req.NoticeListReq; +import com.ningdatech.pmapi.sys.entity.req.NoticeSaveReq; +import com.ningdatech.pmapi.sys.entity.req.NoticeStatusModifyReq; +import com.ningdatech.pmapi.sys.entity.vo.NoticeDetailVO; +import com.ningdatech.pmapi.sys.entity.vo.NoticeListItemVO; +import com.ningdatech.pmapi.sys.service.INoticeService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + *

+ * MsgManage + *

+ * + * @author WendyYang + * @since 21:30 2022/7/21 + */ +@Component +@RequiredArgsConstructor +public class NoticeManage { + + private final INoticeService noticeService; + private final FileService fileService; + + @Transactional(rollbackFor = Exception.class) + public IdVo saveOrModify(NoticeSaveReq req) { + Notice notice = BeanUtil.copyProperties(req, Notice.class); + noticeService.saveOrUpdate(notice); + return IdVo.of(notice.getId()); + } + + public NoticeDetailVO detail(Long id) { + Notice notice = noticeService.getById(id); + NoticeDetailVO detail = BeanUtil.copyProperties(notice, NoticeDetailVO.class); + List fileIds = BizUtils.splitToLong(notice.getAttachment()); + List attachFiles = fileService.getByIds(fileIds); + detail.setAttachments(attachFiles); + return detail; + } + + public boolean changeEnabled(NoticeStatusModifyReq req) { + Notice notice = new Notice(); + notice.setId(req.getId()); + notice.setEnabled(req.getStatus()); + return noticeService.updateById(notice); + } + + + public PageVo dashboardList(Integer limit) { + NoticeListReq req = new NoticeListReq(); + req.setPageSize(limit); + req.setEnabled(true); + return listByManager(req); + } + + public PageVo listByManager(NoticeListReq req) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(Notice.class) + .eq(req.getEnabled() != null, Notice::getEnabled, req.getEnabled()) + .like(StrUtil.isNotBlank(req.getTitle()), Notice::getTitle, req.getTitle()) + .eq(req.getType() != null, Notice::getType, req.getType()) + .orderByDesc(Notice::getSetTopTime, Notice::getUpdateOn); + Page page = noticeService.page(req.page(), wrapper); + if (page.getTotal() == 0) { + return PageVo.empty(); + } + List tempDataList = CollUtils.convert(page.getRecords(), w -> NoticeListItemVO + .builder() + .id(w.getId()) + .type(w.getType()) + .title(w.getTitle()) + .enabled(w.getEnabled()) + .createOn(w.getCreateOn()) + .topped(w.getSetTopTime() != null) + .build()); + return PageVo.of(tempDataList, page.getTotal()); + } + + public void delNotice(Long id){ + noticeService.removeById(id); + } + +} diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/sys/mapper/NoticeMapper.java b/pmapi/src/main/java/com/ningdatech/pmapi/sys/mapper/NoticeMapper.java new file mode 100644 index 0000000..048c439 --- /dev/null +++ b/pmapi/src/main/java/com/ningdatech/pmapi/sys/mapper/NoticeMapper.java @@ -0,0 +1,16 @@ +package com.ningdatech.pmapi.sys.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ningdatech.pmapi.sys.entity.Notice; + +/** + *

+ * 系统通知 Mapper 接口 + *

+ * + * @author WendyYang + * @since 2022-07-21 + */ +public interface NoticeMapper extends BaseMapper { + +} diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/sys/mapper/NoticeMapper.xml b/pmapi/src/main/java/com/ningdatech/pmapi/sys/mapper/NoticeMapper.xml new file mode 100644 index 0000000..86b3271 --- /dev/null +++ b/pmapi/src/main/java/com/ningdatech/pmapi/sys/mapper/NoticeMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/sys/service/INoticeService.java b/pmapi/src/main/java/com/ningdatech/pmapi/sys/service/INoticeService.java new file mode 100644 index 0000000..9d56c34 --- /dev/null +++ b/pmapi/src/main/java/com/ningdatech/pmapi/sys/service/INoticeService.java @@ -0,0 +1,17 @@ +package com.ningdatech.pmapi.sys.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ningdatech.pmapi.sys.entity.Notice; + +/** + *

+ * 系统通知 服务类 + *

+ * + * @author WendyYang + * @since 2022-07-21 + */ +public interface INoticeService extends IService { + + +} diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/sys/service/impl/NoticeServiceImpl.java b/pmapi/src/main/java/com/ningdatech/pmapi/sys/service/impl/NoticeServiceImpl.java new file mode 100644 index 0000000..3c6fd6e --- /dev/null +++ b/pmapi/src/main/java/com/ningdatech/pmapi/sys/service/impl/NoticeServiceImpl.java @@ -0,0 +1,20 @@ +package com.ningdatech.pmapi.sys.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ningdatech.pmapi.sys.entity.Notice; +import com.ningdatech.pmapi.sys.mapper.NoticeMapper; +import com.ningdatech.pmapi.sys.service.INoticeService; +import org.springframework.stereotype.Service; + +/** + *

+ * 系统通知 服务实现类 + *

+ * + * @author WendyYang + * @since 2022-07-21 + */ +@Service +public class NoticeServiceImpl extends ServiceImpl implements INoticeService { + +} diff --git a/pmapi/src/main/resources/application-dev.yml b/pmapi/src/main/resources/application-dev.yml index b3dadeb..8892203 100644 --- a/pmapi/src/main/resources/application-dev.yml +++ b/pmapi/src/main/resources/application-dev.yml @@ -90,6 +90,10 @@ spring: mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + global-config: + db-config: + logic-delete-value: true + logic-not-delete-value: false logging: config: classpath:logback-spring.xml #日志配置