浏览代码

Merge remote-tracking branch 'origin/dev' into dev

dzx 1 年之前
父节点
当前提交
caad392a20
共有 19 个文件被更改,包括 1282 次插入101 次删除
  1. 2 2
      src/main/java/com/xjrsoft/module/base/mapper/BaseGradeMapper.java
  2. 2 6
      src/main/java/com/xjrsoft/module/oa/controller/NewsController.java
  3. 263 0
      src/main/java/com/xjrsoft/module/oa/controller/ProclamationController.java
  4. 38 32
      src/main/java/com/xjrsoft/module/oa/dto/AddNewsDto.java
  5. 3 3
      src/main/java/com/xjrsoft/module/oa/dto/AddNewsRelationDto.java
  6. 107 0
      src/main/java/com/xjrsoft/module/oa/dto/AddProclamationDto.java
  7. 39 0
      src/main/java/com/xjrsoft/module/oa/dto/ProclamationPageDto.java
  8. 19 0
      src/main/java/com/xjrsoft/module/oa/dto/UpdateProclamationDto.java
  9. 2 0
      src/main/java/com/xjrsoft/module/oa/mapper/NewsMapper.java
  10. 58 0
      src/main/java/com/xjrsoft/module/oa/service/INewsService.java
  11. 459 13
      src/main/java/com/xjrsoft/module/oa/service/impl/NewsServiceImpl.java
  12. 31 0
      src/main/java/com/xjrsoft/module/oa/vo/NewsGradeClassTreeVo.java
  13. 1 1
      src/main/java/com/xjrsoft/module/oa/vo/NewsRelationConfigVo.java
  14. 85 0
      src/main/java/com/xjrsoft/module/oa/vo/ProclamationPageVo.java
  15. 103 0
      src/main/java/com/xjrsoft/module/oa/vo/ProclamationVo.java
  16. 27 24
      src/main/java/com/xjrsoft/module/organization/controller/UserController.java
  17. 5 5
      src/main/java/com/xjrsoft/module/teacher/entity/WfHeadTeacherLeave.java
  18. 24 15
      src/main/java/com/xjrsoft/module/teacher/service/impl/WfTeacherleaveServiceImpl.java
  19. 14 0
      src/test/java/com/xjrsoft/xjrsoftboot/DateTime.java

+ 2 - 2
src/main/java/com/xjrsoft/module/base/mapper/BaseGradeMapper.java

@@ -1,6 +1,6 @@
 package com.xjrsoft.module.base.mapper;
 
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
 import com.xjrsoft.module.base.entity.BaseGrade;
 import org.apache.ibatis.annotations.Mapper;
 
@@ -13,6 +13,6 @@ import org.apache.ibatis.annotations.Mapper;
  * @since 2023-09-02 04:52:58
  */
 @Mapper
-public interface BaseGradeMapper extends BaseMapper<BaseGrade> {
+public interface BaseGradeMapper extends MPJBaseMapper<BaseGrade> {
 
 }

+ 2 - 6
src/main/java/com/xjrsoft/module/oa/controller/NewsController.java

@@ -37,16 +37,13 @@ import java.util.ArrayList;
 import java.util.List;
 
 /**
- * <p>
- * 新闻中心表 前端控制器
- * </p>
- *
+ * 新闻
  * @author zlf
  * @since 2022-06-16
  */
 @RestController
 @RequestMapping(GlobalConstant.OA_MODULE_PREFIX + "/news")
-@Api(value = GlobalConstant.OA_MODULE_PREFIX + "/news", tags = "新闻公告")
+@Api(value = GlobalConstant.OA_MODULE_PREFIX + "/news", tags = "新闻")
 @AllArgsConstructor
 public class NewsController {
 
@@ -56,7 +53,6 @@ public class NewsController {
     private INewsAppendixService newsAppendixService;
     private INewsRelationConfigService newsRelationConfigService;
 
-
     @GetMapping
     @ApiOperation(value = "获取新闻分页")
     public RT<PageOutput<NewsPageVo>> page(NewsPageDto dto) {

+ 263 - 0
src/main/java/com/xjrsoft/module/oa/controller/ProclamationController.java

@@ -0,0 +1,263 @@
+package com.xjrsoft.module.oa.controller;
+
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+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.NewsRelation;
+import com.xjrsoft.module.oa.entity.NewsRelationConfig;
+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.teacher.entity.XjrUser;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+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 + "/proclamation")
+@Api(value = GlobalConstant.OA_MODULE_PREFIX + "/proclamation", tags = "公告")
+@AllArgsConstructor
+public class ProclamationController {
+
+    private INewsService newsService;
+    private INewsRelationService newsRelationService;
+    private INewsRelationConfigService newsRelationConfigService;
+    
+    @GetMapping(value = "/gradeClassTree")
+    @ApiOperation(value="公告年级班级树")
+    public RT<List<NewsGradeClassTreeVo>> gradeClassTree(){
+        List<NewsGradeClassTreeVo> list = newsService.getGradeClassTree();
+        if(ObjectUtil.isNull(list) || list.size() == 0){
+            return RT.error("找不到此数据!");
+        }
+        return RT.ok(list);
+    }
+
+    @GetMapping("/manage-box")
+    @ApiOperation(value = "获取管理公告分页")
+    public RT<PageOutput<ProclamationPageVo>> manageBox(ProclamationPageDto dto) {
+        IPage<ProclamationPageVo> page = newsService.proclamationManageBox(dto);
+        PageOutput<ProclamationPageVo> pageOutput = ConventPage.getPageOutput(page, ProclamationPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping("/receipt-box")
+    @ApiOperation(value = "获取接受公告分页")
+    public RT<PageOutput<ProclamationPageVo>> receiptBox(ProclamationPageDto dto) {
+        IPage<ProclamationPageVo> page = newsService.proclamationReceiptBox(dto);
+        PageOutput<ProclamationPageVo> pageOutput = ConventPage.getPageOutput(page, ProclamationPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+
+    @PostMapping
+    @ApiOperation(value = "新增公告")
+    public RT<Boolean> add(@RequestBody AddProclamationDto addProclamationDto) {
+        return RT.ok(newsService.addProclamation(addProclamationDto));
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value = "公告详情")
+    public RT<ProclamationVo> info(@RequestParam Long id) {
+        ProclamationVo proclamationVo = newsService.getProclamationById(id);
+        if (proclamationVo == null) {
+            RT.error("找不到此公告!");
+        }
+
+        return RT.ok(proclamationVo);
+    }
+
+    @PutMapping
+    @ApiOperation(value = "修改公告")
+    public RT<Boolean> update(@RequestBody UpdateProclamationDto updateProclamationDto) {
+        //News news = BeanUtil.toBean(updateNewsDto, News.class);
+        return RT.ok(newsService.updateProclamation(updateProclamationDto));
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除公告")
+    public RT<Boolean> delete(@RequestBody List<Long> ids) {
+        return RT.ok(newsService.delete(ids));
+    }
+
+
+    @PutMapping("/change-status")
+    @ApiOperation(value = "发布或下架公告")
+    public RT<Boolean> changeStatus(@RequestBody ChangeNewsDto changeNewsDto){
+        if(newsService.changeStatus(changeNewsDto)){
+            return RT.ok(newsService.SendMessage(changeNewsDto.getId()));
+        }
+        return RT.ok("操作失败",null);
+    }
+
+    @PutMapping("/read")
+    @ApiOperation(value = "读公告")
+    public RT<Boolean> read(@RequestBody List<Long> ids) {
+        List<NewsRelation> toSaveList = newsRelationService.list(
+                Wrappers.<NewsRelation>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.<NewsRelation>query().lambda()
+//                .in(NewsRelation::getNewsId, ids)
+//                .eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong()));
+        return RT.ok(newsRelationService.updateBatchById(toSaveList));
+    }
+
+    @PutMapping("/reply")
+    @ApiOperation(value = "公告回复")
+    public RT<Boolean> reply(@RequestBody NewsReplyDto newsReplyDto) {
+        NewsRelation newsRelation = newsRelationService.getOne(
+                Wrappers.<NewsRelation>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<PageOutput<NewsRelationVo>> pageRelation(NewsRelationPageDto dto) {
+
+        IPage<NewsRelationVo> page = newsRelationService.selectJoinListPage(ConventPage.getPage(dto), NewsRelationVo.class,
+                new MPJLambdaWrapper<NewsRelation>()
+                        .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<NewsRelationVo> pageOutput = ConventPage.getPageOutput(page);
+        return RT.ok(pageOutput);
+    }
+
+
+    @GetMapping("/page-relation-config")
+    @ApiOperation(value = "获取公告权限分页")
+    public RT<PageOutput<NewsRelationConfigVo>> pageRelationConfig(NewsRelationPageDto dto) {
+        Wrapper<NewsRelationConfig> wrapper = Wrappers.<NewsRelationConfig>query().lambda()
+                .eq(NewsRelationConfig::getNewsId, dto.getNewsId())
+                .select(NewsRelationConfig.class, x -> VoToColumnUtil.fieldsToColumns(NewsRelationConfigVo.class).contains(x.getProperty()));
+
+        IPage<NewsRelationConfig> page = newsRelationConfigService.page(ConventPage.getPage(dto), wrapper);
+        PageOutput<NewsRelationConfigVo> pageOutput = ConventPage.getPageOutput(page, NewsRelationConfigVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping("/count-relation")
+    @ApiOperation(value = "公告阅读权限统计")
+    public RT<Long[]> countRelation(@RequestParam Long id) {
+        Long total = newsRelationService.count(Wrappers.<NewsRelation>query().lambda().eq(NewsRelation::getNewsId, id));
+        Long notRead = newsRelationService.count(Wrappers.<NewsRelation>query().lambda().eq(NewsRelation::getNewsId, id).eq(NewsRelation::getReadMark, 0));
+        Long isRead = newsRelationService.count(Wrappers.<NewsRelation>query().lambda().eq(NewsRelation::getNewsId, id).eq(NewsRelation::getReadMark, 1));
+        Long isReply = newsRelationService.count(Wrappers.<NewsRelation>query().lambda().eq(NewsRelation::getNewsId, id).isNull(NewsRelation::getReplyContent));
+        Long notReply = newsRelationService.count(Wrappers.<NewsRelation>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<Boolean> updateRelation(@RequestBody UpdateNewsRelationDto updateRelationDto) {
+        return RT.ok(newsService.updateRelation(updateRelationDto));
+    }
+
+    @DeleteMapping("/delete-relation")
+    @ApiOperation(value = "删除公告阅读权限")
+    public RT<Boolean> deleteRelation(@RequestBody DeleteNewsRelationDto deleteNewsRelationDto) {
+        return RT.ok(newsService.deleteRelation(deleteNewsRelationDto));
+    }
+
+    @GetMapping("/count-type")
+    @ApiOperation(value = "未读类型统计")
+    public RT<List<NewsCountTypeVo>> countType() {
+        List<NewsCountTypeVo> newsCountTypeVoList = new ArrayList<>();
+        Integer typeIds[] = {1, 2, 3};
+        for (Integer typeId : typeIds) {
+            Long totalType = newsRelationService.count(Wrappers.<NewsRelation>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.<News>query().lambda().eq(News::getTypeId, typeId).orderByDesc(News::getReleaseTime).last("limit 1"));
+            }
+            if(typeId == 2){
+                news = newsService.selectJoinOne(News.class,
+                        new MPJLambdaWrapper<News>()
+                                .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<Boolean> sendMessage(@RequestParam Long id) {
+        return RT.ok(newsService.SendMessage(id));
+    }
+
+    @GetMapping("/unread-count")
+    @ApiOperation(value = "获取登录人未读消息数量")
+    public RT<Integer> unreadCount() {
+        Integer count = newsService.selectJoinCount(
+            new MPJLambdaWrapper<News>()
+            .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);
+    }
+}

+ 38 - 32
src/main/java/com/xjrsoft/module/oa/dto/AddNewsDto.java

@@ -27,8 +27,6 @@ public class AddNewsDto {
     @Min(value = 1, message = "类型必须大于0")
     private Integer typeId;
 
-    @ApiModelProperty("班级(base_class)")
-    private Long classId;
 
     @ApiModelProperty("状态 1=未发布 2=已发布 3=下架")
     @Min(value = 1, message = "类型必须大于0")
@@ -37,21 +35,21 @@ public class AddNewsDto {
     /**
      * 父级主键
      */
-    @ApiModelProperty("父级主键")
-    private Long categoryId;
+//    @ApiModelProperty("父级主键")
+//    private Long categoryId;
 
     /**
      * 所属类别
      */
-    @ApiModelProperty("所属类别")
-    @Min(value = 1, message = "类型必须大于0")
-    private String category;
+//    @ApiModelProperty("所属类别")
+//    @Min(value = 1, message = "类型必须大于0")
+//    private String category;
 
     /**
      * 完整标题
      */
-    @ApiModelProperty("完整标题")
-    @Length(min = 1, max = 250, message = "完整标题最多250个字符!")
+    @ApiModelProperty("标题")
+    @Length(min = 1, max = 250, message = "标题最多250个字符!")
     private String fullHead;
 
     /**
@@ -64,9 +62,9 @@ public class AddNewsDto {
     /**
      * 简略标题
      */
-    @ApiModelProperty("简略标题")
-    @Length(min = 1, max = 50, message = "简略标题最多50个字符!")
-    private String briefHead;
+//    @ApiModelProperty("简略标题")
+//    @Length(min = 1, max = 50, message = "简略标题最多50个字符!")
+//    private String briefHead;
 
     /**
      * 作者
@@ -78,42 +76,43 @@ public class AddNewsDto {
     /**
      * 编辑
      */
-    @ApiModelProperty("编辑")
-    @Length(min = 1, max = 50, message = "编辑最多50个字符!")
-    private String compileName;
+//    @ApiModelProperty("编辑")
+//    @Length(min = 1, max = 50, message = "编辑最多50个字符!")
+//    private String compileName;
 
     /**
      * Tag词
      */
-    @ApiModelProperty("Tag词")
-    @Length(min = 1, max = 255, message = "Tag词最多255个字符!")
-    private String tagWord;
+//    @ApiModelProperty("Tag词")
+//    @Length(min = 1, max = 255, message = "Tag词最多255个字符!")
+//    private String tagWord;
 
     /**
      * 关键字
      */
-    @ApiModelProperty("关键字")
-    @Length(min = 1, max = 250, message = "关键字最多250个字符!")
-    private String keyword;
+//    @ApiModelProperty("关键字")
+//    @Length(min = 1, max = 250, message = "关键字最多250个字符!")
+//    private String keyword;
 
     /**
      * 来源
      */
-    @ApiModelProperty("来源")
-    @Length(min = 1, max = 250, message = "来源最多250个字符!")
-    private String sourceName;
+//    @ApiModelProperty("来源")
+//    @Length(min = 1, max = 250, message = "来源最多250个字符!")
+//    private String sourceName;
 
     /**
      * 来源地址
      */
-    @ApiModelProperty("来源地址")
-    @Length(min = 1, max = 250, message = "来源地址最多250个字符!")
-    private String sourceAddress;
+//    @ApiModelProperty("来源地址")
+//    @Length(min = 1, max = 250, message = "来源地址最多250个字符!")
+//    private String sourceAddress;
 
     /**
      * 新闻内容
      */
     @ApiModelProperty("新闻内容")
+    @Length(min = 1, max = 1000, message = "新闻内容最多1000个字符!")
     private String newsContent;
 
     /**
@@ -143,8 +142,8 @@ public class AddNewsDto {
     /**
      * 张贴开起时间
      */
-    @ApiModelProperty("张贴开起时间")
-    private LocalDateTime sendStartDate;
+//    @ApiModelProperty("张贴开起时间")
+//    private LocalDateTime sendStartDate;
 
     /**
      * 张贴结束时间
@@ -173,12 +172,19 @@ public class AddNewsDto {
     /**
      * 级别 1=校级 2=班级
      */
-    @ApiModelProperty("级别 1=校级 2=班级")
-    private Integer level;
+//    @ApiModelProperty("级别 1=校级 2=班级")
+//    private Integer level;
+
+    /**
+     * 班级
+     */
+//    @ApiModelProperty("班级(base_class)")
+//    private Long classId;
+
     /**
      * 发送范围 1=所有人 2=根据权限
      */
-    @ApiModelProperty("发送范围 1=所有人 2=根据权限")
+    @ApiModelProperty("发送范围 1=全校教职工 2=全校师生 3=指定人员")
     private Integer sendRange;
 
     /**

+ 3 - 3
src/main/java/com/xjrsoft/module/oa/dto/AddNewsRelationDto.java

@@ -6,12 +6,12 @@ import lombok.Data;
 @Data
 public class AddNewsRelationDto {
 
-    @ApiModelProperty("关系类型 1=部门 2=人员")
+    @ApiModelProperty("关系类型 1=部门 2=人员 3=班级")
     private Integer relationType;
 
     @ApiModelProperty("关系ID")
     private Long relationId;
 
-//    @ApiModelProperty("新闻主键")
-//    private Long newsId;
+    @ApiModelProperty("父节点主键")
+    private Long parentId;
 }

+ 107 - 0
src/main/java/com/xjrsoft/module/oa/dto/AddProclamationDto.java

@@ -0,0 +1,107 @@
+package com.xjrsoft.module.oa.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * @author Zexy
+ */
+@Data
+public class AddProclamationDto {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 类型(1-新闻2-公告)
+     */
+    @ApiModelProperty("类型(1-新闻2-公告)")
+    @NotNull(message = "类型(1-新闻2-公告)!")
+    @Min(value = 1, message = "类型必须大于0")
+    private Integer typeId;
+
+
+    @ApiModelProperty("状态 1=未发布 2=已发布 3=下架")
+    @Min(value = 1, message = "类型必须大于0")
+    private Integer status;
+
+    /**
+     * 完整标题
+     */
+    @ApiModelProperty("标题")
+    @Length(min = 1, max = 250, message = "标题最多250个字符!")
+    private String fullHead;
+
+    /**
+     * 标题颜色
+     */
+    @ApiModelProperty("标题颜色")
+    @Length(min = 1, max = 50, message = "标题颜色最多50个字符!")
+    private String fullHeadColor;
+
+    /**
+     * 发送部门
+     */
+    @ApiModelProperty("发送部门")
+    private Long sendDeptId;
+
+    /**
+     * 发布时间
+     */
+    @ApiModelProperty("发布时间")
+    private LocalDateTime releaseTime;
+
+    /**
+     * 紧急程度  1=一般 2=紧急
+     */
+    @ApiModelProperty("紧急程度  1=一般 2=紧急")
+    private Integer emergent;
+
+    /**
+     * 接收人回复要求 1=必须回复 2=不允许回复 3=可以回复 (不强制要求)
+     */
+    @ApiModelProperty("接收人回复要求 1=必须回复 2=不允许回复 3=可以回复 (不强制要求)")
+    private Integer openReply;
+
+    /**
+     * 发送范围 1=所有人 2=根据权限
+     */
+    @ApiModelProperty("发送范围 1=全校教职工 2=全校师生 3=指定人员")
+    private Integer sendRange;
+
+    /**
+     * 张贴结束时间
+     */
+    @ApiModelProperty("张贴结束时间")
+    private LocalDateTime sendEndDate;
+
+    /**
+     * 新闻内容
+     */
+    @ApiModelProperty("新闻内容")
+    @Length(min = 1, max = 1000, message = "新闻内容最多1000个字符!")
+    private String newsContent;
+
+    /**
+     * 附件子表
+     */
+    @ApiModelProperty("附件子表")
+    @TableField(exist = false)
+    @EntityMapping(thisField = "id", joinField = "newsId")
+    private List<AddNewsAppendixDto> appendixList;
+
+    /**
+     * 关系子表
+     */
+    @ApiModelProperty("关系子表")
+    @TableField(exist = false)
+    @EntityMapping(thisField = "id", joinField = "newsId")
+    private List<AddNewsRelationDto> relationList;
+}

+ 39 - 0
src/main/java/com/xjrsoft/module/oa/dto/ProclamationPageDto.java

@@ -0,0 +1,39 @@
+package com.xjrsoft.module.oa.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+
+/**
+ *
+ * @Author: szx
+ * @Date: 2022/6/27 15:38
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ProclamationPageDto extends PageInput {
+
+    @ApiModelProperty(value = "类型(1-新闻2-公告)",hidden = true)
+    @NotNull(message = "类型不能为空!")
+    @Min(value = 1, message = "类型必须大于0")
+    private Integer type;
+    /**
+     * 完整标题
+     */
+    @ApiModelProperty("完整标题")
+    private String fullHead;
+    /**
+     * 关键字
+     */
+    @ApiModelProperty("关键字")
+    private String keyword;
+    /**
+     * 当前用户id
+     */
+    @ApiModelProperty(value = "当前用户id", hidden = true)
+    private Long loginId;
+}

+ 19 - 0
src/main/java/com/xjrsoft/module/oa/dto/UpdateProclamationDto.java

@@ -0,0 +1,19 @@
+package com.xjrsoft.module.oa.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Author: tzx
+ * @Date: 2022/6/27 16:27
+ */
+@Data
+public class UpdateProclamationDto extends AddProclamationDto{
+
+    /**
+     * 主键id
+     */
+    @NotNull(message = "id不能为空!")
+    private Long id;
+}

+ 2 - 0
src/main/java/com/xjrsoft/module/oa/mapper/NewsMapper.java

@@ -20,4 +20,6 @@ public interface NewsMapper extends MPJBaseMapper<News> {
     IPage<NewsPageVo> manageBox(IPage<NewsPageDto> page,NewsPageDto dto);
 
     IPage<NewsPageVo> receiptBox(IPage<NewsPageDto> page,NewsPageDto dto);
+
+    //Boolean insert();
 }

+ 58 - 0
src/main/java/com/xjrsoft/module/oa/service/INewsService.java

@@ -4,7 +4,10 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.yulichang.base.MPJBaseService;
 import com.xjrsoft.module.oa.dto.*;
 import com.xjrsoft.module.oa.entity.News;
+import com.xjrsoft.module.oa.vo.NewsGradeClassTreeVo;
 import com.xjrsoft.module.oa.vo.NewsPageVo;
+import com.xjrsoft.module.oa.vo.ProclamationPageVo;
+import com.xjrsoft.module.oa.vo.ProclamationVo;
 
 import java.util.List;
 
@@ -17,6 +20,61 @@ import java.util.List;
  * @since 2022-06-16
  */
 public interface INewsService extends MPJBaseService<News> {
+
+    /**
+     * 公告年级班级树
+     *
+     * @param
+     * @return
+     */
+    List<NewsGradeClassTreeVo> getGradeClassTree();
+
+    /**
+     * 添加新闻
+     *
+     * @param addProclamationDto
+     * @return
+     */
+    Boolean addProclamation(AddProclamationDto addProclamationDto);
+
+    /**
+     * 根据id获取公告详情
+     *
+     * @param id
+     * @return
+     */
+    ProclamationVo getProclamationById(Long id);
+
+    /**
+     * 获取新闻分页
+     *
+     * @param dto
+     * @return
+     */
+    IPage<ProclamationPageVo> proclamationManageBox(ProclamationPageDto dto);
+
+    /**
+     * 获取新闻分页
+     *
+     * @param dto
+     * @return
+     */
+    IPage<ProclamationPageVo> proclamationReceiptBox(ProclamationPageDto dto);
+
+    /**
+     * 发布或下架公告
+     * @param changeNewsDto
+     * @return
+     */
+    Boolean changeStatus(ChangeNewsDto changeNewsDto);
+
+    /**
+     * 修改公告
+     * @param updateProclamationDto
+     * @return
+     */
+    boolean updateProclamation(UpdateProclamationDto updateProclamationDto);
+
     /**
      * 添加新闻
      *

+ 459 - 13
src/main/java/com/xjrsoft/module/oa/service/impl/NewsServiceImpl.java

@@ -5,15 +5,23 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.enums.EnabledMark;
+import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.utils.LocalDateTimeUtil;
+import com.xjrsoft.common.utils.TreeUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.config.CommonPropertiesConfig;
+import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.base.entity.BaseGrade;
+import com.xjrsoft.module.base.mapper.BaseClassMapper;
+import com.xjrsoft.module.base.mapper.BaseGradeMapper;
 import com.xjrsoft.module.oa.dto.*;
 import com.xjrsoft.module.oa.entity.News;
 import com.xjrsoft.module.oa.entity.NewsAppendix;
@@ -23,25 +31,29 @@ import com.xjrsoft.module.oa.mapper.NewsAppendixMapper;
 import com.xjrsoft.module.oa.mapper.NewsMapper;
 import com.xjrsoft.module.oa.mapper.NewsRelationConfigMapper;
 import com.xjrsoft.module.oa.mapper.NewsRelationMapper;
+import com.xjrsoft.module.oa.service.INewsAppendixService;
+import com.xjrsoft.module.oa.service.INewsRelationService;
 import com.xjrsoft.module.oa.service.INewsService;
-import com.xjrsoft.module.oa.vo.NewsPageVo;
-import com.xjrsoft.module.oa.vo.NewsRelationVo;
+import com.xjrsoft.module.oa.vo.*;
 import com.xjrsoft.module.organization.dto.WeChatSendMessageDto;
-import com.xjrsoft.module.organization.entity.Department;
-import com.xjrsoft.module.organization.entity.User;
-import com.xjrsoft.module.organization.entity.UserDeptRelation;
+import com.xjrsoft.module.organization.entity.*;
+import com.xjrsoft.module.organization.mapper.DepartmentMapper;
 import com.xjrsoft.module.organization.mapper.UserDeptRelationMapper;
 import com.xjrsoft.module.organization.mapper.UserMapper;
 import com.xjrsoft.module.organization.service.IWeChatService;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
 import com.xjrsoft.module.student.mapper.BaseStudentSchoolRollMapper;
+import com.xjrsoft.module.system.entity.File;
 import com.xjrsoft.module.teacher.entity.XjrUser;
 import com.xjrsoft.module.teacher.mapper.XjrUserMapper;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.time.LocalDateTime;
 import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -74,10 +86,416 @@ public class NewsServiceImpl extends MPJBaseServiceImpl<NewsMapper, News> implem
 
     private final UserMapper userMapper;
 
+    private final BaseGradeMapper baseGradeMapper;
+
+    private final DepartmentMapper departmentMapper;
+
+    private final BaseClassMapper baseClassMapper;
+
     private final XjrUserMapper xjrUserMapper;
 
     private final CommonPropertiesConfig commonPropertiesConfig;
 
+    private INewsRelationService newsRelationService;
+    private INewsAppendixService newsAppendixService;
+
+    @Override
+    public List<NewsGradeClassTreeVo> getGradeClassTree() {
+        List<NewsGradeClassTreeVo> treeVoList = new ArrayList<NewsGradeClassTreeVo>();
+
+        //虚拟父级
+        treeVoList.add(new NewsGradeClassTreeVo(){{
+            setId(666666L);
+            setName("班级");
+        }});
+
+        //获取所有班级的年级作为树的父级
+        MPJLambdaWrapper<BaseClass> queryGrade = new MPJLambdaWrapper<>();
+        queryGrade
+                .distinct()
+                .selectAs(BaseGrade::getId, BaseGrade::getId)
+                .selectAs(BaseGrade::getName, BaseGrade::getName)
+                .leftJoin(BaseGrade.class, BaseGrade::getId, BaseClass::getGradeId);
+        List<BaseGrade> gradeList = baseClassMapper.selectJoinList(BaseGrade.class, queryGrade);
+        gradeList.forEach((node) -> {
+            treeVoList.add(new NewsGradeClassTreeVo(){{
+                setId(node.getId());
+                setName(node.getName());
+                setParentId(666666L);
+            }});
+        });
+
+
+        List<BaseClass> classList = baseClassMapper.selectList(new QueryWrapper<BaseClass>());
+        //获取班级荣誉中出现的学期下的所有班级作为树的子级
+        classList.forEach((node) -> {
+            treeVoList.add(new NewsGradeClassTreeVo(){{
+                setId(node.getId());
+                setName(node.getName());
+                setParentId(node.getGradeId());
+            }});
+        });
+
+        List<NewsGradeClassTreeVo> resultTreeVoList = TreeUtil.build(treeVoList);
+        return resultTreeVoList;
+    }
+
+    @Override
+    public Boolean addProclamation(AddProclamationDto addProclamationDto) {
+        News news = BeanUtil.toBean(addProclamationDto, News.class);
+        news.setTypeId(2);
+        news.setEnabledMark(EnabledMark.ENABLED.getCode());
+        LambdaQueryWrapper<News> queryWrapperSortcode = new LambdaQueryWrapper<>();
+        //queryWrapperSortcode.select("SELECT IFNULL(MAX(sort_code),1)");
+        newsMapper.insert(news);
+
+        //添加附件子表
+        if (addProclamationDto.getAppendixList() != null) {
+            for (AddNewsAppendixDto appendixDto : addProclamationDto.getAppendixList()) {
+                NewsAppendix newsAppendix = BeanUtil.toBean(appendixDto, NewsAppendix.class);
+                newsAppendix.setNewsId(news.getId());
+                newsAppendixMapper.insert(newsAppendix);
+            }
+        }
+
+        //公告需要添加阅读关系,关系类型 1=部门 2=人员 3=班级
+        if (addProclamationDto.getSendRange() == 3 && addProclamationDto.getRelationList() != null) {
+            for (AddNewsRelationDto relationDto : addProclamationDto.getRelationList()) {
+                if (relationDto.getRelationType() == 1) {
+                    Department department = departmentMapper.selectById(relationDto.getRelationId());
+                    newsRelationConfigMapper.insert(new NewsRelationConfig(){{
+                        setNewsId(news.getId());
+                        setRelationId(relationDto.getRelationId());
+                        setRelationType(relationDto.getRelationType());
+                        if(department != null){
+                            setRelationName(department.getName());
+                        }
+                    }});
+                }
+                if (relationDto.getRelationType() == 2)  {
+                    XjrUser xjrUser = xjrUserMapper.selectById(relationDto.getRelationId());
+                    newsRelationConfigMapper.insert(new NewsRelationConfig(){{
+                        setNewsId(news.getId());
+                        setRelationId(relationDto.getRelationId());
+                        setRelationType(relationDto.getRelationType());
+                        if(xjrUser != null){
+                            setRelationName(xjrUser.getName());
+                        }
+                    }});
+                }
+                if (relationDto.getRelationType() == 3)  {
+                    BaseClass baseClass = baseClassMapper.selectById(relationDto.getRelationId());
+                    BaseGrade baseGrade = null;
+                    if(baseClass == null){
+                        baseGrade = baseGradeMapper.selectById(relationDto.getRelationId());
+                    }
+                    BaseGrade finalBaseGrade = baseGrade;
+                    newsRelationConfigMapper.insert(new NewsRelationConfig(){{
+                        setNewsId(news.getId());
+                        setRelationId(relationDto.getRelationId());
+                        setRelationType(relationDto.getRelationType());
+                        if(baseClass != null){
+                            setRelationName(baseClass.getName());
+                        }
+                        if(finalBaseGrade != null){
+                            setRelationName(finalBaseGrade.getName());
+                        }
+                    }});
+                }
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public ProclamationVo getProclamationById(Long id) {
+        MPJLambdaWrapper<News> queryWrapperNews = new MPJLambdaWrapper<>();
+        queryWrapperNews
+                .select(News::getId)
+                .selectAs(Department::getName, ProclamationVo::getSendDeptIdCN)
+                .select(News.class, x -> VoToColumnUtil.fieldsToColumns(ProclamationVo.class).contains(x.getProperty()))
+                .leftJoin(Department.class, Department::getId, News::getSendDeptId)
+                .eq(News::getId , id);
+        ProclamationVo proclamationVo = this.selectJoinOne(ProclamationVo.class, queryWrapperNews);
+        if (proclamationVo == null) {
+           return null;
+        }
+
+        //添加阅读关系集合
+        List<NewsRelationConfigVo> newsRelationConfigVoList = new ArrayList<>();
+        //公告在草稿状态还没有阅读状态,只有阅读关系
+        if(proclamationVo.getStatus() == 1){
+            MPJLambdaWrapper<NewsRelationConfig> queryWrapperNewsRelationConfig = new MPJLambdaWrapper<>();
+            queryWrapperNewsRelationConfig
+                    .select(NewsRelationConfig.class, x -> VoToColumnUtil.fieldsToColumns(NewsRelationConfigVo.class).contains(x.getProperty()))
+                    .eq(NewsRelationConfig::getNewsId , proclamationVo.getId());
+            newsRelationConfigVoList = newsRelationConfigMapper.selectJoinList(NewsRelationConfigVo.class, queryWrapperNewsRelationConfig);
+        }
+        proclamationVo.setNewsRelationConfigVoList(newsRelationConfigVoList);
+
+        //添加阅读状态集合
+        List<NewsRelationVo> newsRelationVoList = new ArrayList<>();
+        //公告在发布状态或下架状态
+        if(proclamationVo.getStatus() == 2 || proclamationVo.getStatus() == 3){
+            MPJLambdaWrapper<NewsRelation> queryWrapper = new MPJLambdaWrapper<>();
+            queryWrapper
+                    .select(NewsRelation::getId)
+                    .selectAs(XjrUser::getName,NewsRelationVo::getUserName)
+                    .select(NewsRelation.class, x -> VoToColumnUtil.fieldsToColumns(NewsRelationVo.class).contains(x.getProperty()))
+                    .leftJoin(XjrUser.class,XjrUser::getId,NewsRelation::getUserId)
+                    .eq(NewsRelation::getNewsId , proclamationVo.getId())
+                    .disableSubLogicDel();
+            //当是发布人点击了该公告可以看到其下所有人的回复
+            if(ObjectUtil.isNotNull(proclamationVo.getCreateUserId()) && StpUtil.getLoginIdAsLong() == proclamationVo.getCreateUserId()) {
+                newsRelationVoList = newsRelationService.selectJoinList(NewsRelationVo.class, queryWrapper);
+            }else {//当不是发布人点击了该公告只能看到自己的回复
+                queryWrapper.eq(NewsRelation::getUserId , StpUtil.getLoginIdAsLong());
+                NewsRelationVo newsRelationVo = newsRelationService.selectJoinOne(NewsRelationVo.class, queryWrapper);
+                if(ObjectUtil.isNotNull(newsRelationVo)){
+                    newsRelationVoList.add(newsRelationVo);
+                }
+            }
+        }
+
+        proclamationVo.setRelationList(newsRelationVoList);
+
+        //添加附件
+        List<NewsAppendixVo> newsAppendixVoList = newsAppendixService.selectJoinList(NewsAppendixVo.class,
+                new MPJLambdaWrapper<NewsAppendix>().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) {
+            proclamationVo.setAppendixList(newsAppendixVoList);
+        }
+
+        return proclamationVo;
+    }
+
+    @Override
+    public IPage<ProclamationPageVo> proclamationManageBox(ProclamationPageDto dto) {
+        MPJLambdaWrapper<News> queryNews = new MPJLambdaWrapper<>();
+        queryNews
+                .select(News::getId)
+                .selectAs(Department::getName, ProclamationPageVo::getSendDeptIdCN)
+                .select(News.class, x -> VoToColumnUtil.fieldsToColumns(ProclamationPageVo.class).contains(x.getProperty()))
+                .leftJoin(Department.class, Department::getId, News::getSendDeptId)
+                .eq(News::getCreateUserId, StpUtil.getLoginIdAsLong())
+                .eq(News::getTypeId, 2)
+                .like(dto.getFullHead() != null, News::getFullHead, dto.getFullHead())
+                .like(dto.getKeyword() != null, News::getNewsContent, dto.getKeyword())
+                .orderByDesc(News::getReleaseTime)
+                .disableSubLogicDel();
+        IPage<ProclamationPageVo> page = this.selectJoinListPage(ConventPage.getPage(dto), ProclamationPageVo.class, queryNews);
+        return page;
+    }
+
+    @Override
+    public IPage<ProclamationPageVo> proclamationReceiptBox(ProclamationPageDto dto) {
+        MPJLambdaWrapper<News> queryNews = new MPJLambdaWrapper<>();
+        queryNews
+                .select(News::getId)
+                .selectAs(Department::getName, ProclamationPageVo::getSendDeptIdCN)
+                .select(News.class, x -> VoToColumnUtil.fieldsToColumns(ProclamationPageVo.class).contains(x.getProperty()))
+                .leftJoin(Department.class, Department::getId, News::getSendDeptId)
+                .leftJoin(NewsRelation.class, NewsRelation::getNewsId, News::getId)
+                .eq(News::getTypeId, 2)
+                .eq(News::getStatus, 2)
+                .gt(News::getSendEndDate, new Date())
+                .eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong())
+                .or()
+                .eq(News::getSendRange, 2)
+                .orderByDesc(News::getReleaseTime)
+                .disableSubLogicDel();;
+        IPage<ProclamationPageVo> page = this.selectJoinListPage(ConventPage.getPage(dto), ProclamationPageVo.class, queryNews);
+        return page;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean changeStatus(ChangeNewsDto changeNewsDto) {
+        News xjrNews = this.getById(changeNewsDto.getId());
+        if (changeNewsDto.getStatus() == null || xjrNews == null) {
+            throw new MyException("参数异常");
+        }
+        if (changeNewsDto.getStatus().equals(xjrNews.getStatus())) {
+            if (changeNewsDto.getStatus() == 2) {
+                throw new MyException("公告已发布!!!");
+            } else if (changeNewsDto.getStatus() == 3) {
+                throw new MyException("公告已下架!!!");
+            }
+        }
+
+        xjrNews.setStatus(changeNewsDto.getStatus());
+        //发布公告,将阅读关系中选择的阅读人添加到关系表
+        if(xjrNews.getStatus() == 2){
+            //将发布时间改为当前时间
+            xjrNews.setReleaseTime(LocalDateTime.now());
+            //将张贴时间改为当前时间
+            xjrNews.setSendStartDate(LocalDateTime.now());
+            xjrNews.setModifyUserId(StpUtil.getLoginIdAsLong());
+            xjrNews.setModifyDate(LocalDateTime.now());
+
+            LambdaQueryWrapper<NewsRelationConfig> queryConfig = new LambdaQueryWrapper<>();
+            queryConfig
+                    .eq(NewsRelationConfig::getNewsId, xjrNews.getId());
+            List<NewsRelationConfig> newsRelationConfigList = newsRelationConfigMapper.selectList(queryConfig);
+
+            HashMap<Long, XjrUser> userMap = new HashMap<>();
+            if(xjrNews.getSendRange() == 3){
+                //遍历所有关系配置
+                for (NewsRelationConfig newsRelationConfig : newsRelationConfigList) {
+                    //阅读关系是部门
+                    if(newsRelationConfig.getRelationType() == 1){
+                        // 获取部门下的人员添加
+                        Long deptId = newsRelationConfig.getRelationId();
+                        MPJLambdaWrapper<XjrUser> queryUser = new MPJLambdaWrapper<>();
+                        queryUser
+                                .leftJoin(UserDeptRelation.class,UserDeptRelation::getUserId,XjrUser::getId)
+                                .leftJoin(Department.class,Department::getId,UserDeptRelation::getDeptId)
+                                .eq(Department::getId,deptId);
+                        List<XjrUser> userList = xjrUserMapper.selectJoinList(XjrUser.class,queryUser);
+                        for (XjrUser user: userList) {
+                            if(!userMap.containsKey(user.getId())){
+                                userMap.put(user.getId(),user);
+                                newsRelationMapper.insert(new NewsRelation(){{
+                                    setNewsId(xjrNews.getId());
+                                    setUserId(user.getId());
+                                    setReadMark(0);
+                                    setCreateDate(LocalDateTime.now());
+                                }});
+                            }
+                        }
+                    }
+                    //阅读关系是人员
+                    if(newsRelationConfig.getRelationType() == 2){
+                        if(!userMap.containsKey(newsRelationConfig.getRelationId())){
+                            userMap.put(newsRelationConfig.getRelationId(),new XjrUser(){{
+                                setId(newsRelationConfig.getRelationId());
+                            }});
+                            newsRelationMapper.insert(new NewsRelation(){{
+                                setNewsId(xjrNews.getId());
+                                setUserId(newsRelationConfig.getRelationId());
+                                setReadMark(0);
+                                setCreateDate(LocalDateTime.now());
+                            }});
+                        }
+                    }
+                    //阅读关系是班级
+                    if(newsRelationConfig.getRelationType() == 3){
+                        // 获取班级下的人员添加
+                        Long classId = newsRelationConfig.getRelationId();
+                        MPJLambdaWrapper<XjrUser> queryUser = new MPJLambdaWrapper<>();
+                        queryUser
+                                .leftJoin(BaseStudentSchoolRoll.class,BaseStudentSchoolRoll::getUserId,XjrUser::getId)
+                                .eq(BaseStudentSchoolRoll::getClassId,classId);
+                        List<XjrUser> userList = xjrUserMapper.selectJoinList(XjrUser.class,queryUser);
+                        for (XjrUser user: userList) {
+                            if(!userMap.containsKey(user.getId())){
+                                userMap.put(user.getId(),user);
+                                newsRelationMapper.insert(new NewsRelation(){{
+                                    setNewsId(xjrNews.getId());
+                                    setUserId(user.getId());
+                                    setReadMark(0);
+                                    setCreateDate(LocalDateTime.now());
+                                }});
+                            }
+                        }
+                    }
+                }
+            }
+            if(xjrNews.getSendRange() == 1){
+                MPJLambdaWrapper<XjrUser> queryUser = new MPJLambdaWrapper<>();
+                queryUser
+                        .leftJoin(UserRoleRelation.class, UserRoleRelation::getUserId, XjrUser::getId)
+                        .leftJoin(Role.class, Role::getId, UserRoleRelation::getRoleId)
+                        .eq(Role::getId,2);
+                List<XjrUser> userList = xjrUserMapper.selectJoinList(XjrUser.class,queryUser);
+                for (XjrUser user: userList) {
+                    if(!userMap.containsKey(user.getId())){
+                        userMap.put(user.getId(),user);
+                        newsRelationMapper.insert(new NewsRelation(){{
+                            setNewsId(xjrNews.getId());
+                            setUserId(user.getId());
+                            setReadMark(0);
+                            setCreateDate(LocalDateTime.now());
+                        }});
+                    }
+                }
+            }
+        }
+
+        if(xjrNews.getStatus() == 3){
+            //应该将关系配置表和关系表的数据设置为删除
+        }
+        return this.updateById(xjrNews);
+    }
+
+    @Override
+    public boolean updateProclamation(UpdateProclamationDto updateProclamationDto) {
+        News news = BeanUtil.toBean(updateProclamationDto, News.class);
+        news.setModifyDate(LocalDateTime.now());
+        news.setModifyUserId(StpUtil.getLoginIdAsLong());
+        newsMapper.updateById(news);
+
+        newsAppendixMapper.delete(Wrappers.lambdaQuery(NewsAppendix.class).eq(NewsAppendix::getNewsId, news.getId()));
+        if (updateProclamationDto.getAppendixList() != null) {
+            for (AddNewsAppendixDto appendixDto : updateProclamationDto.getAppendixList()) {
+                NewsAppendix newsAppendix = BeanUtil.toBean(appendixDto, NewsAppendix.class);
+                newsAppendix.setNewsId(news.getId());
+                newsAppendixMapper.insert(newsAppendix);
+            }
+        }
+
+        if (updateProclamationDto.getSendRange() == 3 && updateProclamationDto.getRelationList() != null) {
+            newsRelationMapper.delete(Wrappers.lambdaQuery(NewsRelation.class).eq(NewsRelation::getNewsId, news.getId()));
+            newsRelationConfigMapper.delete(Wrappers.lambdaQuery(NewsRelationConfig.class).eq(NewsRelationConfig::getNewsId, news.getId()));
+
+            for (AddNewsRelationDto relationDto : updateProclamationDto.getRelationList()) {
+                if (relationDto.getRelationType() == 1) {
+                    Department department = departmentMapper.selectById(relationDto.getRelationId());
+
+                    newsRelationConfigMapper.insert(new NewsRelationConfig(){{
+                        setNewsId(news.getId());
+                        setRelationId(relationDto.getRelationId());
+                        setRelationType(relationDto.getRelationType());
+                        if(department != null){
+                            setRelationName(department.getName());
+                        }
+                    }});
+                }
+                if (relationDto.getRelationType() == 2)  {
+                    XjrUser xjrUser = xjrUserMapper.selectById(relationDto.getRelationId());
+
+                    newsRelationConfigMapper.insert(new NewsRelationConfig(){{
+                        setNewsId(news.getId());
+                        setRelationId(relationDto.getRelationId());
+                        setRelationType(relationDto.getRelationType());
+                        if(xjrUser != null){
+                            setRelationName(xjrUser.getName());
+                        }
+                    }});
+                }
+                if (relationDto.getRelationType() == 3)  {
+                    BaseClass baseClass = baseClassMapper.selectById(relationDto.getRelationId());
+
+                    newsRelationConfigMapper.insert(new NewsRelationConfig(){{
+                        setNewsId(news.getId());
+                        setRelationId(relationDto.getRelationId());
+                        setRelationType(relationDto.getRelationType());
+                        if(baseClass != null){
+                            setRelationName(baseClass.getName());
+                        }
+                    }});
+                }
+            }
+        }
+        return true;
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean add(AddNewsDto addNewsDto) {
@@ -85,7 +503,6 @@ public class NewsServiceImpl extends MPJBaseServiceImpl<NewsMapper, News> implem
         News news = BeanUtil.toBean(addNewsDto, News.class);
         news.setEnabledMark(EnabledMark.ENABLED.getCode());
 
-
         newsMapper.insert(news);
         //添加附件子表
         if (addNewsDto.getAppendixList() != null) {
@@ -96,8 +513,23 @@ public class NewsServiceImpl extends MPJBaseServiceImpl<NewsMapper, News> implem
             }
         }
 
-        //公告需要添加阅读关系
-        if (addNewsDto.getRelationList() != null) {
+        //公告需要添加阅读关系,发送范围 1=全校教职工 2=全校师生 3=指定人员
+        //1=全校教职工,添加全校教职工到关系表
+//        if(addNewsDto.getTypeId() == 2 && addNewsDto.getSendRange() == 1){
+//            MPJLambdaWrapper<XjrUser> queryUser = new MPJLambdaWrapper<>();
+//            queryUser
+//                    .leftJoin(UserRoleRelation.class, UserRoleRelation::getUserId, XjrUser::getId)
+//                    .leftJoin(Role.class, Role::getId, UserRoleRelation::getRoleId)
+//                    .eq(Role::getId, 2);
+//            List<XjrUser> userList = xjrUserMapper.selectJoinList(XjrUser.class,queryUser);
+//            for (XjrUser user: userList) {
+//                newsRelation.setUserId(user.getId());
+//                newsRelationMapper.insert(newsRelation);
+//            }
+
+//        }
+
+        if (addNewsDto.getTypeId() == 2 && addNewsDto.getSendRange() == 1) {
             for (AddNewsRelationDto relationDto : addNewsDto.getRelationList()) {
 
                 NewsRelationConfig newsRelationConfig = BeanUtil.toBean(relationDto, NewsRelationConfig.class);
@@ -116,6 +548,24 @@ public class NewsServiceImpl extends MPJBaseServiceImpl<NewsMapper, News> implem
                             .leftJoin(Department.class,Department::getId,UserDeptRelation::getDeptId)
                             .eq(Department::getId,deptId);
                     List<XjrUser> userList = xjrUserMapper.selectJoinList(XjrUser.class,queryUser);
+                    for (XjrUser user: userList) {
+                        newsRelation.setUserId(user.getId());
+                        newsRelationMapper.insert(newsRelation);
+                    }
+                }
+                if (relationDto.getRelationType() == 2)  {
+                    newsRelation.setUserId(relationDto.getRelationId());
+                    newsRelationMapper.insert(newsRelation);
+                }
+                if (relationDto.getRelationType() == 3)  {
+                    // 获取班级下的人员添加
+                    Long deptId = relationDto.getRelationId();
+                    MPJLambdaWrapper<XjrUser> queryUser = new MPJLambdaWrapper<>();
+                    queryUser
+                            .leftJoin(UserDeptRelation.class,UserDeptRelation::getUserId,XjrUser::getId)
+                            .leftJoin(Department.class,Department::getId,UserDeptRelation::getDeptId)
+                            .eq(Department::getId,deptId);
+                    List<XjrUser> userList = xjrUserMapper.selectJoinList(XjrUser.class,queryUser);
                     List<Long> userIdList = new ArrayList<>();
                     for (XjrUser user: userList) {
                         userIdList.add(user.getId());
@@ -124,9 +574,6 @@ public class NewsServiceImpl extends MPJBaseServiceImpl<NewsMapper, News> implem
                         newsRelation.setUserId(userId);
                         newsRelationMapper.insert(newsRelation);
                     }
-                } else {
-                    newsRelation.setUserId(relationDto.getRelationId());
-                    newsRelationMapper.insert(newsRelation);
                 }
             }
         }
@@ -312,7 +759,7 @@ public class NewsServiceImpl extends MPJBaseServiceImpl<NewsMapper, News> implem
     public boolean SendMessage(Long id) {
         try {
             News news = newsMapper.selectById(id);
-            if (news.getSendRange() == 1) {
+            if (news.getSendRange() == 2) {
                 List<User> userList = userMapper.selectList(Wrappers.<User>query().lambda().isNotNull(User::getOpenId).ne(User::getOpenId, ""));
                 if (userList.size() > 0) {
                     for (User user : userList) {
@@ -373,7 +820,6 @@ public class NewsServiceImpl extends MPJBaseServiceImpl<NewsMapper, News> implem
             }
         } catch (Exception ex) {
         }
-
         return true;
     }
 }

+ 31 - 0
src/main/java/com/xjrsoft/module/oa/vo/NewsGradeClassTreeVo.java

@@ -0,0 +1,31 @@
+package com.xjrsoft.module.oa.vo;
+
+import com.xjrsoft.common.model.tree.ITreeNode;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @title: 公告年级班级树出参
+ * @Author szs
+ * @Date: 2023-12-06
+ * @Version 1.0
+ */
+@Data
+public class NewsGradeClassTreeVo implements ITreeNode<NewsGradeClassTreeVo,Long>, Serializable {
+
+
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    @ApiModelProperty("班级名")
+    private String name;
+
+    @ApiModelProperty("父级id")
+    private Long parentId;
+
+    private List<NewsGradeClassTreeVo> children;
+}

+ 1 - 1
src/main/java/com/xjrsoft/module/oa/vo/NewsRelationConfigVo.java

@@ -11,7 +11,7 @@ public class NewsRelationConfigVo {
     @ApiModelProperty("新闻主键")
     private Long newsId;
 
-    @ApiModelProperty("关系类型 1=部门 2=人员")
+    @ApiModelProperty("关系类型 1=部门 2=人员 3=班级")
     private Integer relationType;
 
     @ApiModelProperty("关系ID")

+ 85 - 0
src/main/java/com/xjrsoft/module/oa/vo/ProclamationPageVo.java

@@ -0,0 +1,85 @@
+package com.xjrsoft.module.oa.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * @Author: szs
+ * @Date: 2022/6/27 15:37
+ */
+@Data
+public class ProclamationPageVo {
+    /**
+     * 公告主键
+     */
+    @ApiModelProperty("公告主键")
+    private Long id;
+
+    /**
+     * 类型(1-新闻 2-公告)
+     */
+    @ApiModelProperty("类型(1-新闻 2-公告)")
+    private Integer typeId;
+
+    /**
+     * 完整标题
+     */
+    @ApiModelProperty("完整标题")
+    private String fullHead;
+
+    /**
+     * 标题颜色
+     */
+    @ApiModelProperty("标题颜色")
+    private String fullHeadColor;
+
+    /**
+     * 公告内容
+     */
+    @ApiModelProperty("公告内容")
+    private String newsContent;
+
+    /**
+     * 发布时间
+     */
+    @ApiModelProperty("发布时间")
+    private LocalDateTime releaseTime;
+
+    /**
+     * 紧急程度  1=一般 2=紧急
+     */
+    @ApiModelProperty("紧急程度  1=一般 2=紧急")
+    private Integer emergent;
+
+    /**
+     * 发送部门
+     */
+    @ApiModelProperty("发送部门")
+    private Long sendDeptId;
+
+    /**
+     * 发送部门
+     */
+    @ApiModelProperty("发送部门")
+    private String sendDeptIdCN;
+
+    /**
+     * 张贴结束时间
+     */
+    @ApiModelProperty("张贴结束时间")
+    private LocalDateTime sendEndDate;
+
+    /**
+     * 接收人回复要求 1=必须回复 2=不允许回复 3=可以回复 (不强制要求)
+     */
+    @ApiModelProperty("接收人回复要求 1=必须回复 2=不允许回复 3=可以回复 (不强制要求)")
+    private Integer openReply;
+
+    /**
+     * 状态 1=未发布 2=已发布 3=下架
+     */
+    @ApiModelProperty("状态 1=未发布 2=已发布 3=下架")
+    private Integer status;
+}

+ 103 - 0
src/main/java/com/xjrsoft/module/oa/vo/ProclamationVo.java

@@ -0,0 +1,103 @@
+package com.xjrsoft.module.oa.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 公告详情出参
+ * @Author: szs
+ * @Date: 2023/3/8 14:34
+ */
+@Data
+public class ProclamationVo {
+
+    @ApiModelProperty("主键")
+    private Long id;
+
+    @ApiModelProperty("状态 1=未发布 2=已发布 3=下架")
+    private Integer status;
+
+    @ApiModelProperty("完整标题")
+    private String fullHead;
+
+    @ApiModelProperty("标题颜色")
+    private String fullHeadColor;
+
+    /**
+     * 发送部门
+     */
+    @ApiModelProperty("发送部门")
+    private Long sendDeptId;
+
+    /**
+     * 发送部门
+     */
+    @ApiModelProperty("发送部门")
+    private String sendDeptIdCN;
+
+    @ApiModelProperty("发布时间")
+    private LocalDateTime releaseTime;
+
+    /**
+     * 紧急程度  1=一般 2=紧急
+     */
+    @ApiModelProperty("紧急程度  1=一般 2=紧急")
+    private Integer emergent;
+
+    /**
+     * 接收人回复要求 1=必须回复 2=不允许回复 3=可以回复 (不强制要求)
+     */
+    @ApiModelProperty("接收人回复要求 1=必须回复 2=不允许回复 3=可以回复 (不强制要求)")
+    private Integer openReply;
+
+    /**
+     * 发送范围 1=所有人 2=根据权限
+     */
+    @ApiModelProperty("发送范围 1=全校教职工 2=全校师生 3=指定人员")
+    private Integer sendRange;
+
+    /**
+     * 张贴结束时间
+     */
+    @ApiModelProperty("张贴结束时间")
+    private LocalDateTime sendEndDate;
+
+    @ApiModelProperty("新闻内容")
+    private String newsContent;
+
+    /**
+     * 发送部门
+     */
+    @ApiModelProperty("发送部门")
+    private Long createUserId;
+
+    /**
+     * 附件子表
+     */
+    @ApiModelProperty("附件子表")
+    @TableField(exist = false)
+    @EntityMapping(thisField = "id", joinField = "newsId")
+    private List<NewsAppendixVo> appendixList;
+
+    /**
+     * 关系子表
+     */
+    @ApiModelProperty("关系子表")
+    @TableField(exist = false)
+    @EntityMapping(thisField = "id", joinField = "newsId")
+    private List<NewsRelationVo> relationList;
+
+    /**
+     * 关系配置子表
+     */
+    @ApiModelProperty("关系配置子表")
+    @TableField(exist = false)
+    @EntityMapping(thisField = "id", joinField = "newsId")
+    private List<NewsRelationConfigVo> newsRelationConfigVoList;
+
+}

+ 27 - 24
src/main/java/com/xjrsoft/module/organization/controller/UserController.java

@@ -10,7 +10,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fasterxml.jackson.core.type.TypeReference;
-import com.github.yulichang.toolkit.MPJWrappers;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.enums.EnabledMark;
 import com.xjrsoft.common.enums.RoleEnum;
@@ -117,26 +117,28 @@ public class UserController {
 
         //因为多表关联 会有多个表都使用了id字段,  所以必须专门指定主表的Id
         if (ObjectUtil.isNotNull(dto.getDepartmentId())) {//不为空联合查询
-            IPage<UserPageVo> page = userService.selectJoinListPage(ConventPage.getPage(dto), UserPageVo.class,
-                    MPJWrappers.<User>lambdaJoin()
-                            .disableSubLogicDel()
-                            .distinct()
-                            .like(StrUtil.isNotBlank(dto.getKeyword()), User::getName, dto.getKeyword())
-                            .or(StrUtil.isNotBlank(dto.getKeyword()), x -> x.like(StrUtil.isNotBlank(dto.getKeyword()), User::getCode, dto.getKeyword()))
-                            .in(ObjectUtil.isNotNull(dto.getDepartmentId()), UserDeptRelation::getDeptId, deptIds)
-                            .like(StrUtil.isNotBlank(dto.getUserName()), User::getUserName, dto.getUserName())
-                            .like(StrUtil.isNotBlank(dto.getCode()), User::getCode, dto.getCode())
-                            .like(StrUtil.isNotBlank(dto.getName()), User::getName, dto.getName())
-                            .like(StrUtil.isNotBlank(dto.getMobile()), User::getMobile, dto.getMobile())
-                            .eq(ObjectUtil.isNotNull(dto.getUserType()), Role::getId, dto.getUserType())
-                            .orderByDesc(User::getCreateDate)
-                            .select(User::getId)
-                            .select(User.class, x -> VoToColumnUtil.fieldsToColumns(UserPageVo.class).contains(x.getProperty()))
-                            .leftJoin(UserDeptRelation.class, UserDeptRelation::getUserId, User::getId)
-                            .leftJoin(UserRoleRelation.class, UserRoleRelation::getUserId, User::getId)
-                            .leftJoin(Role.class, Role::getId, UserRoleRelation::getRoleId));
+            MPJLambdaWrapper<User> queryUser = new MPJLambdaWrapper<>();
+            queryUser
+                    .disableSubLogicDel()
+                    .distinct()
+                    .like(StrUtil.isNotBlank(dto.getKeyword()), User::getName, dto.getKeyword())
+                    .or(StrUtil.isNotBlank(dto.getKeyword()), x -> x.like(StrUtil.isNotBlank(dto.getKeyword()), User::getCode, dto.getKeyword()))
+                    .in(ObjectUtil.isNotNull(dto.getDepartmentId()), UserDeptRelation::getDeptId, deptIds)
+                    .like(StrUtil.isNotBlank(dto.getUserName()), User::getUserName, dto.getUserName())
+                    .like(StrUtil.isNotBlank(dto.getCode()), User::getCode, dto.getCode())
+                    .like(StrUtil.isNotBlank(dto.getName()), User::getName, dto.getName())
+                    .like(StrUtil.isNotBlank(dto.getMobile()), User::getMobile, dto.getMobile())
+                    .eq(ObjectUtil.isNotNull(dto.getUserType()), Role::getId, dto.getUserType())
+                    .orderByDesc(User::getId)
+                    .select(User::getId)
+                    .select(User.class, x -> VoToColumnUtil.fieldsToColumns(UserPageVo.class).contains(x.getProperty()))
+                    .leftJoin(UserDeptRelation.class, UserDeptRelation::getUserId, User::getId)
+                    .leftJoin(UserRoleRelation.class, UserRoleRelation::getUserId, User::getId)
+                    .leftJoin(Role.class, Role::getId, UserRoleRelation::getRoleId);
+            IPage<UserPageVo> page = userService.selectJoinListPage(ConventPage.getPage(dto), UserPageVo.class, queryUser);
+
 
-            PageOutput<UserPageVo> pageOutput = ConventPage.getPageOutput(page);
+            PageOutput<UserPageVo> pageOutput = ConventPage.getPageOutput(page, UserPageVo.class);
 
             return R.ok(pageOutput);
         } else {
@@ -152,8 +154,8 @@ public class UserController {
 //
 //            IPage<User> page = userService.page(ConventPage.getPage(dto),queryWrapper);
 
-            IPage<UserPageVo> page = userService.selectJoinListPage(ConventPage.getPage(dto), UserPageVo.class,
-                    MPJWrappers.<User>lambdaJoin()
+                    MPJLambdaWrapper<User> queryUser = new MPJLambdaWrapper<>();
+                    queryUser
                             .disableSubLogicDel()
                             .distinct()
                             .like(StrUtil.isNotBlank(dto.getKeyword()), User::getName, dto.getKeyword())
@@ -163,11 +165,12 @@ public class UserController {
                             .like(StrUtil.isNotBlank(dto.getName()), User::getName, dto.getName())
                             .like(StrUtil.isNotBlank(dto.getMobile()), User::getMobile, dto.getMobile())
                             .eq(ObjectUtil.isNotNull(dto.getUserType()), Role::getId, dto.getUserType())
-                            .orderByDesc(User::getCreateDate)
+                            .orderByDesc(User::getId)
                             .select(User::getId)
                             .select(User.class, x -> VoToColumnUtil.fieldsToColumns(UserPageVo.class).contains(x.getProperty()))
                             .leftJoin(UserRoleRelation.class, UserRoleRelation::getUserId, User::getId)
-                            .leftJoin(Role.class, Role::getId, UserRoleRelation::getRoleId));
+                            .leftJoin(Role.class, Role::getId, UserRoleRelation::getRoleId);
+            IPage<UserPageVo> page = userService.selectJoinListPage(ConventPage.getPage(dto), UserPageVo.class,queryUser);
             PageOutput<UserPageVo> pageOutput = ConventPage.getPageOutput(page, UserPageVo.class);
             return R.ok(pageOutput);
         }

+ 5 - 5
src/main/java/com/xjrsoft/module/teacher/entity/WfHeadTeacherLeave.java

@@ -92,13 +92,13 @@ public class WfHeadTeacherLeave implements Serializable {
     /**
     * 开始时间
     */
-    @ApiModelProperty("开始时间")
+    @ApiModelProperty("请假日期")
     private Date startTime;
     /**
-    * 结束时间
-    */
-    @ApiModelProperty("结束时间")
-    private Date endTime;
+     * 请假时间段 1=上午 2=下午
+     */
+    @ApiModelProperty("请假时间段 1=上午 2=下午")
+    private Integer timePeriod;
     /**
     * 是否有替班教师(1:是 0:否)
     */

+ 24 - 15
src/main/java/com/xjrsoft/module/teacher/service/impl/WfTeacherleaveServiceImpl.java

@@ -1,6 +1,7 @@
 package com.xjrsoft.module.teacher.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.xjrsoft.common.enums.LeaveReasonEnum;
 import com.xjrsoft.module.teacher.entity.WfHeadTeacherLeave;
@@ -14,7 +15,9 @@ import org.springframework.stereotype.Service;
 
 import java.time.*;
 import java.time.temporal.ChronoUnit;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
 
 /**
  * @title: 教职工请假流程
@@ -50,13 +53,13 @@ public class WfTeacherleaveServiceImpl extends MPJBaseServiceImpl<WfTeacherleave
                 DayOfWeek dayOfWeek = startTime.getDayOfWeek();
                 int dayOfWeekValue = dayOfWeek.getValue();
 
-                LocalDateTime forenoonStartDateTime = LocalDateTime.of(startTime.toLocalDate(), LocalTime.of(6, 0, 0));
-                LocalDateTime forenoonEndDateTime = LocalDateTime.of(startTime.toLocalDate(), LocalTime.of(11, 0, 0));
-                LocalDateTime afternoonStartDateTime = LocalDateTime.of(startTime.toLocalDate(), LocalTime.of(14, 0, 0));
-                LocalDateTime afternoonEndDateTime = LocalDateTime.of(startTime.toLocalDate(), LocalTime.of(22, 0, 0));
+                //LocalDateTime forenoonStartDateTime = LocalDateTime.of(startTime.toLocalDate(), LocalTime.of(9, 50, 0));
+                LocalDateTime forenoonEndDateTime = LocalDateTime.of(startTime.toLocalDate(), LocalTime.of(10, 30, 0));
+                //LocalDateTime afternoonStartDateTime = LocalDateTime.of(startTime.toLocalDate(), LocalTime.of(14, 0, 0));
+                LocalDateTime afternoonEndDateTime = LocalDateTime.of(startTime.toLocalDate(), LocalTime.of(15, 30, 0));
                 /*
                  *当天是在星期一到星期四,
-                 * 且开始时间早于当天上午区间的开始时间,
+                 * 且开始时间早于当天上午区间的结束时间,
                  * 结束时间晚于当天上午区间的结束时间,
                  * 自动同步一条请假类型为“早自习、课间操”的数据到班主任事项请假列表。
                  */
@@ -71,9 +74,7 @@ public class WfTeacherleaveServiceImpl extends MPJBaseServiceImpl<WfTeacherleave
                         Instant startTimeInstant = startTime.atZone(ZoneId.systemDefault()).toInstant();
                         Date startTimeDate = Date.from(startTimeInstant);
                         setStartTime(startTimeDate);
-                        Instant endTimeInstant = endTime.atZone(ZoneId.systemDefault()).toInstant();
-                        Date endTimeDate = Date.from(endTimeInstant);
-                        setEndTime(endTimeDate);
+                        setTimePeriod(1);
                         setRemark(wfTeacherleave.getReasonForLeave());
                         setStatus(1);
                         if(wfTeacherleave.getLeaveDays() <= 1){
@@ -82,12 +83,17 @@ public class WfTeacherleaveServiceImpl extends MPJBaseServiceImpl<WfTeacherleave
                         if(wfTeacherleave.getLeaveDays() > 1){
                             setSubstituteUserId(wfTeacherleave.getReliefTeacherId());
                         }
-
+                        setCreateDate(new Date());
+                        //setCreateUserId(StpUtil.getLoginIdAsLong());
+                        QueryWrapper<WfHeadTeacherLeave> queryWrapperSortcode = new QueryWrapper<>();
+                        queryWrapperSortcode.select("IFNULL(MAX(sort_code),1) as sortCode");
+                        WfHeadTeacherLeave w = wfHeadTeacherLeaveService.getOne(queryWrapperSortcode);
+                        setSortCode(w.getSortCode());
                     }});
                 }
                 /*
                  * 当天是在星期五,
-                 * 且开始时间早于下午区间的开始时间,
+                 * 且开始时间早于下午区间的结束时间,
                  * 结束时间晚于下午区间的结束时间,
                  * 自动同步一条请假类型为“学生放假”的数据到班主任事项请假列表。
                  */
@@ -102,12 +108,15 @@ public class WfTeacherleaveServiceImpl extends MPJBaseServiceImpl<WfTeacherleave
                     Instant startTimeInstant = startTime.atZone(ZoneId.systemDefault()).toInstant();
                     Date startTimeDate = Date.from(startTimeInstant);
                     wfHeadTeacherLeave.setStartTime(startTimeDate);
-                    Instant endTimeInstant = endTime.atZone(ZoneId.systemDefault()).toInstant();
-                    Date endTimeDate = Date.from(endTimeInstant);
-                    wfHeadTeacherLeave.setEndTime(endTimeDate);
+                    wfHeadTeacherLeave.setTimePeriod(2);
                     wfHeadTeacherLeave.setRemark(wfTeacherleave.getReasonForLeave());
                     wfHeadTeacherLeave.setStatus(1);
-
+                    wfHeadTeacherLeave.setCreateDate(new Date());
+                    //wfHeadTeacherLeave.setCreateUserId(StpUtil.getLoginIdAsLong());
+                    QueryWrapper<WfHeadTeacherLeave> queryWrapperSortcode = new QueryWrapper<>();
+                    queryWrapperSortcode.select("IFNULL(MAX(sort_code),0) as sortCode");
+                    WfHeadTeacherLeave w = wfHeadTeacherLeaveService.getOne(queryWrapperSortcode);
+                    wfHeadTeacherLeave.setSortCode(w.getSortCode());
                     wfHeadTeacherLeaveList.add(wfHeadTeacherLeave);
                 }
             }

+ 14 - 0
src/test/java/com/xjrsoft/xjrsoftboot/DateTime.java

@@ -3,10 +3,24 @@ package com.xjrsoft.xjrsoftboot;
 import cn.hutool.core.date.DateUtil;
 import org.junit.jupiter.api.Test;
 
+import java.util.ArrayList;
+import java.util.List;
+
 public class DateTime {
     @Test
     public void DateTimeTest(){
         cn.hutool.core.date.DateTime now = DateUtil.date();
         System.out.println(now.dayOfWeek());
     }
+
+    @Test
+    public void collectionTest(){
+        Long num1 = 23L;
+        Long num2 = 23L;
+        List<Long> list = new ArrayList<>();
+        list.add(num1);
+        list.add(num2);
+        Long num3 = 23L;
+        System.err.println(list.contains(23L));
+    }
 }