瀏覽代碼

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

fanxp 1 年之前
父節點
當前提交
9a7d775a4a
共有 38 個文件被更改,包括 1626 次插入148 次删除
  1. 31 0
      src/main/java/com/xjrsoft/common/utils/excel/CustomCellRangeAddress.java
  2. 52 0
      src/main/java/com/xjrsoft/common/utils/excel/HandleUtil.java
  3. 2 2
      src/main/java/com/xjrsoft/module/base/mapper/BaseGradeMapper.java
  4. 2 6
      src/main/java/com/xjrsoft/module/oa/controller/NewsController.java
  5. 263 0
      src/main/java/com/xjrsoft/module/oa/controller/ProclamationController.java
  6. 38 32
      src/main/java/com/xjrsoft/module/oa/dto/AddNewsDto.java
  7. 3 3
      src/main/java/com/xjrsoft/module/oa/dto/AddNewsRelationDto.java
  8. 107 0
      src/main/java/com/xjrsoft/module/oa/dto/AddProclamationDto.java
  9. 39 0
      src/main/java/com/xjrsoft/module/oa/dto/ProclamationPageDto.java
  10. 19 0
      src/main/java/com/xjrsoft/module/oa/dto/UpdateProclamationDto.java
  11. 2 0
      src/main/java/com/xjrsoft/module/oa/mapper/NewsMapper.java
  12. 58 0
      src/main/java/com/xjrsoft/module/oa/service/INewsService.java
  13. 459 13
      src/main/java/com/xjrsoft/module/oa/service/impl/NewsServiceImpl.java
  14. 31 0
      src/main/java/com/xjrsoft/module/oa/vo/NewsGradeClassTreeVo.java
  15. 1 1
      src/main/java/com/xjrsoft/module/oa/vo/NewsRelationConfigVo.java
  16. 85 0
      src/main/java/com/xjrsoft/module/oa/vo/ProclamationPageVo.java
  17. 103 0
      src/main/java/com/xjrsoft/module/oa/vo/ProclamationVo.java
  18. 27 24
      src/main/java/com/xjrsoft/module/organization/controller/UserController.java
  19. 21 4
      src/main/java/com/xjrsoft/module/personnel/controller/BasePersonnelLabourCapitalController.java
  20. 0 10
      src/main/java/com/xjrsoft/module/personnel/dto/AddBasePersonnelLabourCapitalDto.java
  21. 1 1
      src/main/java/com/xjrsoft/module/personnel/dto/AddBasePersonnelLabourCapitalTitleDto.java
  22. 55 0
      src/main/java/com/xjrsoft/module/personnel/dto/ImportBasePersonnelLabourCapitalDto.java
  23. 1 1
      src/main/java/com/xjrsoft/module/personnel/entity/BasePersonnelLabourCapitalTitle.java
  24. 1 1
      src/main/java/com/xjrsoft/module/personnel/vo/BasePersonnelLabourCapitalTitleVo.java
  25. 83 4
      src/main/java/com/xjrsoft/module/room/controller/RoomValueWeekController.java
  26. 2 1
      src/main/java/com/xjrsoft/module/room/service/IRoomValueWeekService.java
  27. 57 8
      src/main/java/com/xjrsoft/module/room/service/impl/RoomValueWeekServiceImpl.java
  28. 7 7
      src/main/java/com/xjrsoft/module/room/vo/RoomValueWeekItemExcelVo.java
  29. 5 5
      src/main/java/com/xjrsoft/module/teacher/entity/WfHeadTeacherLeave.java
  30. 24 15
      src/main/java/com/xjrsoft/module/teacher/service/impl/WfTeacherleaveServiceImpl.java
  31. 1 1
      src/main/java/com/xjrsoft/module/textbook/dto/TeacherCheckByStuDto.java
  32. 1 2
      src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookStudentClaimServiceImpl.java
  33. 6 2
      src/main/java/com/xjrsoft/module/textbook/service/impl/WfTextbookClaimServiceImpl.java
  34. 10 0
      src/main/java/com/xjrsoft/module/textbook/service/impl/WfTextbookRecedeServiceImpl.java
  35. 5 1
      src/main/resources/mapper/room/RoomBedMapper.xml
  36. 1 0
      src/main/resources/mapper/textbook/TextbookMapper.xml
  37. 9 4
      src/main/resources/mapper/textbook/TextbookStudentClaimMapper.xml
  38. 14 0
      src/test/java/com/xjrsoft/xjrsoftboot/DateTime.java

+ 31 - 0
src/main/java/com/xjrsoft/common/utils/excel/CustomCellRangeAddress.java

@@ -0,0 +1,31 @@
+package com.xjrsoft.common.utils.excel;
+
+import org.apache.poi.ss.util.CellRangeAddress;
+
+/**
+ * @author dzx
+ * @date 2024/1/8
+ */
+public class CustomCellRangeAddress extends CellRangeAddress {
+
+    //字体是否加粗
+    private boolean isBlod;
+
+    public boolean getIsBlod() {
+        return isBlod;
+    }
+
+    public void setIsBlod(boolean blod) {
+        isBlod = blod;
+    }
+
+    public CustomCellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol) {
+        super(firstRow, lastRow, firstCol, lastCol);
+    }
+
+    public CustomCellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol, Boolean isBlod) {
+        super(firstRow, lastRow, firstCol, lastCol);
+        setIsBlod(isBlod);
+    }
+
+}

+ 52 - 0
src/main/java/com/xjrsoft/common/utils/excel/HandleUtil.java

@@ -0,0 +1,52 @@
+package com.xjrsoft.common.utils.excel;
+
+import org.apache.poi.ss.usermodel.BorderStyle;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.usermodel.VerticalAlignment;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xssf.usermodel.XSSFCell;
+import org.apache.poi.xssf.usermodel.XSSFCellStyle;
+import org.apache.poi.xssf.usermodel.XSSFFont;
+import org.apache.poi.xssf.usermodel.XSSFRow;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+
+/**
+ * @author dzx
+ * @date 2024/1/8
+ */
+public class HandleUtil {
+
+    public static void setRegionStyle(XSSFSheet sheet, CellRangeAddress region, XSSFCellStyle xssfCellStyle) {
+        for (int i = region.getFirstRow(); i <= region.getLastRow(); i++) {
+            XSSFRow row = sheet.getRow(i);
+            if (null == row) row = sheet.createRow(i);
+            for (int j = region.getFirstColumn(); j <= region.getLastColumn(); j++) {
+                XSSFCell cell = row.getCell(j);
+                if (null == cell) cell = row.createCell(j);
+                cell.setCellStyle(xssfCellStyle);
+            }
+        }
+    }
+
+    public static XSSFCellStyle setDefaultStyle(XSSFWorkbook workbook, Boolean isBold) {
+        XSSFCellStyle cellStyle = workbook.createCellStyle();
+        // 边框
+        cellStyle.setBorderBottom(BorderStyle.THIN);
+        cellStyle.setBorderLeft(BorderStyle.THIN);
+        cellStyle.setBorderRight(BorderStyle.THIN);
+        cellStyle.setBorderTop(BorderStyle.THIN);
+        // 居中
+        cellStyle.setAlignment(HorizontalAlignment.CENTER);
+        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        // 字体
+        XSSFFont font = workbook.createFont();
+        font.setFontName("Calibri");
+        if(isBold){
+            font.setBold(isBold);
+        }
+        font.setFontHeightInPoints((short) 10);
+        cellStyle.setFont(font);
+        return cellStyle;
+    }
+}

+ 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);
         }

+ 21 - 4
src/main/java/com/xjrsoft/module/personnel/controller/BasePersonnelLabourCapitalController.java

@@ -3,6 +3,7 @@ package com.xjrsoft.module.personnel.controller;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.bean.BeanUtil;
 import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.support.ExcelTypeEnum;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.xjrsoft.common.model.result.RT;
@@ -11,6 +12,7 @@ import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.personnel.dto.AddBasePersonnelLabourCapitalDto;
 import com.xjrsoft.module.personnel.dto.BasePersonnelLabourCapitalPageDto;
+import com.xjrsoft.module.personnel.dto.ImportBasePersonnelLabourCapitalDto;
 import com.xjrsoft.module.personnel.dto.UpdateBasePersonnelLabourCapitalDto;
 import com.xjrsoft.module.personnel.entity.BasePersonnelLabourCapital;
 import com.xjrsoft.module.personnel.entity.BasePersonnelLabourCapitalData;
@@ -18,10 +20,13 @@ import com.xjrsoft.module.personnel.entity.BasePersonnelLabourCapitalTitle;
 import com.xjrsoft.module.personnel.service.IBasePersonnelLabourCapitalService;
 import com.xjrsoft.module.personnel.vo.BasePersonnelLabourCapitalPageVo;
 import com.xjrsoft.module.personnel.vo.BasePersonnelLabourCapitalVo;
+import com.xjrsoft.module.weekly.dto.WeeklyDutySchedulePageDto;
+import com.xjrsoft.module.weekly.vo.WeeklyDutyScheduleListVo;
 import com.yomahub.liteflow.util.JsonUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -33,6 +38,7 @@ import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.validation.Valid;
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
@@ -107,7 +113,7 @@ public class BasePersonnelLabourCapitalController {
     }
     @PostMapping("/import")
     @ApiOperation(value = "导入")
-    public RT<Boolean> importData(@Valid @RequestBody AddBasePersonnelLabourCapitalDto dto, @RequestParam MultipartFile file) throws IOException {
+    public RT<Boolean> importData(@Valid ImportBasePersonnelLabourCapitalDto dto, @RequestParam("file") MultipartFile file) throws IOException {
         List<Map<Integer, Object>> excelDataList = EasyExcel.read(file.getInputStream()).sheet().headRowNumber(dto.getDataRow() - 1).doReadSync();
         //验证数据
 
@@ -132,7 +138,7 @@ public class BasePersonnelLabourCapitalController {
      * @param excelDataList 表格数据
      * @return 返回集合
      */
-    List<BasePersonnelLabourCapitalData> initDataList(AddBasePersonnelLabourCapitalDto dto, List<Map<Integer, Object>> excelDataList){
+    List<BasePersonnelLabourCapitalData> initDataList(ImportBasePersonnelLabourCapitalDto dto, List<Map<Integer, Object>> excelDataList){
         List<BasePersonnelLabourCapitalData> resultList = new ArrayList<>();
         for (int i = 0; i < excelDataList.size(); i ++){
             //跳过表头
@@ -185,7 +191,7 @@ public class BasePersonnelLabourCapitalController {
 
             title.setName(value.toString());
             title.setColumnNumber(column);
-            title.setRowNumber(4);
+            title.setRowsNumber(4);
             title.setMergeColumns(mergeColumns);
             title.setMergeRows(mergeRows);
             resultList.add(title);
@@ -204,7 +210,7 @@ public class BasePersonnelLabourCapitalController {
 
             title.setName(value.toString());
             title.setColumnNumber(column);
-            title.setRowNumber(4);
+            title.setRowsNumber(4);
             title.setMergeColumns(mergeColumns);
             title.setMergeRows(mergeRows);
             resultList.add(title);
@@ -213,4 +219,15 @@ public class BasePersonnelLabourCapitalController {
         return resultList;
     }
 
+    @GetMapping("/export")
+    @ApiOperation(value = "导出")
+
+    public ResponseEntity<byte[]> exportData(@Valid WeeklyDutySchedulePageDto dto, @RequestParam(defaultValue = "false") Boolean isTemplate) {
+        List<BasePersonnelLabourCapital> list = basePersonnelLabourCapitalService.list();
+        ByteArrayOutputStream bot = new ByteArrayOutputStream();
+        EasyExcel.write(bot, WeeklyDutyScheduleListVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(list);
+
+        return RT.fileStream(bot.toByteArray(), "WeeklyDutySchedule" + ExcelTypeEnum.XLSX.getValue());
+    }
+
 }

+ 0 - 10
src/main/java/com/xjrsoft/module/personnel/dto/AddBasePersonnelLabourCapitalDto.java

@@ -66,14 +66,4 @@ public class AddBasePersonnelLabourCapitalDto implements Serializable {
     @ApiModelProperty("数据文件")
     private String dataFile;
 
-    /**
-    * basePersonnelLabourCapitalData
-    */
-    @ApiModelProperty("basePersonnelLabourCapitalData子表")
-    private List<AddBasePersonnelLabourCapitalDataDto> basePersonnelLabourCapitalDataList;
-    /**
-    * basePersonnelLabourCapitalTitle
-    */
-    @ApiModelProperty("basePersonnelLabourCapitalTitle子表")
-    private List<AddBasePersonnelLabourCapitalTitleDto> basePersonnelLabourCapitalTitleList;
 }

+ 1 - 1
src/main/java/com/xjrsoft/module/personnel/dto/AddBasePersonnelLabourCapitalTitleDto.java

@@ -32,7 +32,7 @@ public class AddBasePersonnelLabourCapitalTitleDto implements Serializable {
     * 所属行
     */
     @ApiModelProperty("所属行")
-    private Integer rowNumber;
+    private Integer rowsNumber;
     /**
     * 所属列
     */

+ 55 - 0
src/main/java/com/xjrsoft/module/personnel/dto/ImportBasePersonnelLabourCapitalDto.java

@@ -0,0 +1,55 @@
+package com.xjrsoft.module.personnel.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+* @title: 工资发放
+* @Author dzx
+* @Date: 2023-11-08
+* @Version 1.0
+*/
+@Data
+public class ImportBasePersonnelLabourCapitalDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键编号")
+    private String id;
+    /**
+    * 数据开始行
+    */
+    @ApiModelProperty("数据开始行")
+    private Integer dataRow;
+    /**
+    * 证件类型所属列
+    */
+    @ApiModelProperty("证件类型所属列")
+    private Integer idTypeColumn;
+    /**
+    * 证件号码所属列
+    */
+    @ApiModelProperty("证件号码所属列")
+    private Integer idNumberColumn;
+    /**
+    * 工号所属列
+    */
+    @ApiModelProperty("工号所属列")
+    private Integer jobNumberColumn;
+    /**
+    * 名称所属列
+    */
+    @ApiModelProperty("名称所属列")
+    private Integer personnelNameColumn;
+    /**
+    * 合计所属列
+    */
+    @ApiModelProperty("合计所属列")
+    private Integer amountToColumn;
+
+}

+ 1 - 1
src/main/java/com/xjrsoft/module/personnel/entity/BasePersonnelLabourCapitalTitle.java

@@ -83,7 +83,7 @@ public class BasePersonnelLabourCapitalTitle implements Serializable {
     * 所属行
     */
     @ApiModelProperty("所属行")
-    private Integer rowNumber;
+    private Integer rowsNumber;
     /**
     * 所属列
     */

+ 1 - 1
src/main/java/com/xjrsoft/module/personnel/vo/BasePersonnelLabourCapitalTitleVo.java

@@ -31,7 +31,7 @@ public class BasePersonnelLabourCapitalTitleVo {
     * 所属行
     */
     @ApiModelProperty("所属行")
-    private Integer rowNumber;
+    private Integer rowsNumber;
     /**
     * 所属列
     */

+ 83 - 4
src/main/java/com/xjrsoft/module/room/controller/RoomValueWeekController.java

@@ -2,20 +2,30 @@ package com.xjrsoft.module.room.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
 import com.alibaba.excel.support.ExcelTypeEnum;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.metadata.WriteTable;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.common.utils.excel.CustomCellRangeAddress;
+import com.xjrsoft.common.utils.excel.HandleUtil;
 import com.xjrsoft.module.room.dto.AddRoomValueWeekDto;
 import com.xjrsoft.module.room.dto.RoomValueWeekPageDto;
 import com.xjrsoft.module.room.dto.UpdateRoomValueWeekDto;
 import com.xjrsoft.module.room.service.IRoomValueWeekService;
+import com.xjrsoft.module.room.vo.RoomValueWeekExcelVo;
+import com.xjrsoft.module.room.vo.RoomValueWeekItemExcelVo;
 import com.xjrsoft.module.room.vo.RoomValueWeekItemVo;
 import com.xjrsoft.module.room.vo.RoomValueWeekPageVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -27,7 +37,10 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
+import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -95,11 +108,77 @@ public class RoomValueWeekController {
 
     @GetMapping("/export")
     @ApiOperation(value = "导出")
-    public ResponseEntity<byte[]> exportData(@Valid RoomValueWeekPageDto dto, @RequestParam(defaultValue = "false") Boolean isTemplate) {
-        List<RoomValueWeekPageVo> customerList = isTemplate != null && isTemplate ? new ArrayList<>() : ((PageOutput<RoomValueWeekPageVo>) page(dto).getData()).getList();
+    public ResponseEntity<byte[]> exportData(@Valid RoomValueWeekPageDto dto, @RequestParam(defaultValue = "false") Boolean isTemplate) throws IOException {
+        List<RoomValueWeekExcelVo> dataList = roomValueWeekService.getList(dto);
+        String sheetName = "数据";
+        String fileName = "RoomValueWeek" + ExcelTypeEnum.XLSX.getValue();
         ByteArrayOutputStream bot = new ByteArrayOutputStream();
-        EasyExcel.write(bot, RoomValueWeekPageVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(customerList);
 
-        return RT.fileStream(bot.toByteArray(), "RoomValueWeek" + ExcelTypeEnum.XLSX.getValue());
+        ExcelWriter excelWriter = EasyExcel.write(bot).excelType(ExcelTypeEnum.XLSX).build();
+        WriteSheet writeSheet = EasyExcel.writerSheet(sheetName).needHead(Boolean.FALSE).build();
+
+        List<RoomValueWeekItemExcelVo> demoDataList2 = new ArrayList<>();
+        demoDataList2.add(new RoomValueWeekItemExcelVo(){{
+            setColumn1("");
+            setColumn2("");
+            setColumn3("");
+            setColumn4("");
+        }});
+
+        //写入数据,并计算需要合并的单元格
+        int tableRows = 6;
+        int j = 0;
+        List<CellRangeAddress> cellRangeAddressList = new ArrayList<>();
+        List<CustomCellRangeAddress> styleList = new ArrayList<>();
+        for (int i = 0; i < dataList.size() * 2; ){
+
+            WriteTable writeTable = EasyExcel.writerTable(i + 1).head(RoomValueWeekItemExcelVo.class).needHead(Boolean.FALSE).build();
+            excelWriter.write(dataList.get(j).getItemList(), writeSheet, writeTable);
+            //存下需要合并的单元格
+            cellRangeAddressList.add(new CellRangeAddress((tableRows * j) + 0, (tableRows * j) + 0, 0, 3));
+            cellRangeAddressList.add(new CellRangeAddress((tableRows * j) + 1, (tableRows * j) + 1, 0, 1));
+            cellRangeAddressList.add(new CellRangeAddress((tableRows * j) + 1, (tableRows * j) + 1, 2, 3));
+            cellRangeAddressList.add(new CellRangeAddress((tableRows * j) + 3, (tableRows * j) + 4, 0, 0));
+            cellRangeAddressList.add(new CellRangeAddress((tableRows * j) + 3, (tableRows * j) + 4, 1, 1));
+
+            //存下需要设置样式的单元
+            styleList.add(new CustomCellRangeAddress((tableRows * j) + 0, (tableRows * j) + 0, 0, 3, Boolean.TRUE));
+            styleList.add(new CustomCellRangeAddress((tableRows * j) + 1, (tableRows * j) + 1, 0, 3, Boolean.TRUE));
+            styleList.add(new CustomCellRangeAddress((tableRows * j) + 2, (tableRows * j) + 2, 0, 3));
+            styleList.add(new CustomCellRangeAddress((tableRows * j) + 3, (tableRows * j) + 3, 0, 3));
+            styleList.add(new CustomCellRangeAddress((tableRows * j) + 4, (tableRows * j) + 4, 0, 3));
+
+            WriteTable writeTable3 = EasyExcel.writerTable(i + 2).build();
+            excelWriter.write(demoDataList2, writeSheet, writeTable3);
+            cellRangeAddressList.add(new CellRangeAddress((tableRows * j) + 5, (tableRows * j) + 5, 0, 3));
+
+            j ++;
+            i = i + 2;
+        }
+        excelWriter.finish();
+
+        // 将ByteArrayOutputStream转换为InputStream
+        InputStream in = new ByteArrayInputStream(bot.toByteArray());
+
+        //使用poi合并单元格,使用registerWriteHandler合并单元格会与fill方法中创建单元格后校验合并单元格冲突而引发报错
+        XSSFWorkbook workbook = new XSSFWorkbook(in);
+        XSSFSheet sheetAt = workbook.getSheet(sheetName);
+        //合并单元格
+        for (CellRangeAddress cellRangeAddress : cellRangeAddressList) {
+            sheetAt.addMergedRegion(cellRangeAddress);
+        }
+        //设置样式
+        for (CustomCellRangeAddress cellRangeAddress : styleList) {
+            HandleUtil.setRegionStyle(sheetAt, cellRangeAddress, HandleUtil.setDefaultStyle(workbook, cellRangeAddress.getIsBlod()));
+        }
+
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        workbook.write(os);
+        os.flush();
+        os.close();
+
+        return RT.fileStream(os.toByteArray(), fileName);
     }
+
+
 }

+ 2 - 1
src/main/java/com/xjrsoft/module/room/service/IRoomValueWeekService.java

@@ -6,6 +6,7 @@ import com.xjrsoft.module.room.dto.AddRoomValueWeekDto;
 import com.xjrsoft.module.room.dto.RoomValueWeekPageDto;
 import com.xjrsoft.module.room.dto.UpdateRoomValueWeekDto;
 import com.xjrsoft.module.room.entity.RoomValueWeek;
+import com.xjrsoft.module.room.vo.RoomValueWeekExcelVo;
 import com.xjrsoft.module.room.vo.RoomValueWeekItemVo;
 import com.xjrsoft.module.room.vo.RoomValueWeekPageVo;
 
@@ -45,7 +46,7 @@ public interface IRoomValueWeekService extends MPJBaseService<RoomValueWeek> {
 
     Page<RoomValueWeekPageVo> getPage(Page<RoomValueWeekPageDto> page, RoomValueWeekPageDto dto);
 
-    List<RoomValueWeek> getList(RoomValueWeekPageDto dto);
+    List<RoomValueWeekExcelVo> getList(RoomValueWeekPageDto dto);
 
     Boolean updateNumberPeople();
 

+ 57 - 8
src/main/java/com/xjrsoft/module/room/service/impl/RoomValueWeekServiceImpl.java

@@ -1,6 +1,7 @@
 package com.xjrsoft.module.room.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -142,28 +143,76 @@ public class RoomValueWeekServiceImpl extends MPJBaseServiceImpl<RoomValueWeekMa
     }
 
     @Override
-    public List<RoomValueWeek> getList(RoomValueWeekPageDto dto) {
+    public List<RoomValueWeekExcelVo> getList(RoomValueWeekPageDto dto) {
         List<RoomValueWeek> weekList = roomValueWeekRoomValueWeekMapper.selectList(
             new QueryWrapper<RoomValueWeek>().lambda()
-            .ge(RoomValueWeek::getEndTime, dto.getEndTime())
-            .le(RoomValueWeek::getStartTime, dto.getStartTime())
+            .le(ObjectUtil.isNotNull(dto.getEndTime()), RoomValueWeek::getEndTime, dto.getEndTime())
+            .ge(ObjectUtil.isNotNull(dto.getStartTime()), RoomValueWeek::getStartTime, dto.getStartTime())
         );
         List<RoomValueWeekExcelVo> dataList = BeanUtil.copyToList(weekList, RoomValueWeekExcelVo.class);
 
         List<RoomValueWeekPageVo> allItemList = roomValueWeekRoomValueWeekItemMapper.getItemList(dto);
-
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
         for (RoomValueWeekExcelVo weekExcelVo : dataList) {
+            String title = sdf.format(weekExcelVo.getStartTime()) + "-" + sdf.format(weekExcelVo.getEndTime()) + "留宿情况及值班安排表";
             List<RoomValueWeekItemExcelVo> itemList = new ArrayList<>();
+            itemList.add(new RoomValueWeekItemExcelVo(){{
+                setColumn1(title);
+                setColumn2(title);
+                setColumn3(title);
+                setColumn4(title);
+            }});
+            itemList.add(new RoomValueWeekItemExcelVo(){{
+                setColumn1("留宿情况");
+                setColumn2("留宿情况");
+                setColumn3("宿舍值班人员安排");
+                setColumn4("宿舍值班人员安排");
+            }});
+
+            int maleStudents = 0;
+            int femaleStudents = 0;
+            String maleHousemaster = "",femaleHousemaster = "", instructor = "";
             for (RoomValueWeekPageVo roomValueWeekPageVo : allItemList) {
-                if(roomValueWeekPageVo.getRoomValueWeekId().equals(weekExcelVo.getId())){
-                    RoomValueWeekItemExcelVo itemExcelVo = new RoomValueWeekItemExcelVo();
+                if(!roomValueWeekPageVo.getRoomValueWeekId().equals(weekExcelVo.getId())){
+                    continue;
+                }
+                if("男寝".equals(roomValueWeekPageVo.getRoomType())){
+                    maleStudents = roomValueWeekPageVo.getNumberPeople();
+                    maleHousemaster = roomValueWeekPageVo.getUserName();
+                }
+                if("女寝".equals(roomValueWeekPageVo.getRoomType())){
+                    femaleStudents = roomValueWeekPageVo.getNumberPeople();
+                    femaleHousemaster = roomValueWeekPageVo.getUserName();
+                }
+                if("教官".equals(roomValueWeekPageVo.getPostName())){
+                    instructor = roomValueWeekPageVo.getUserName();
                 }
             }
-        }
+            RoomValueWeekItemExcelVo maleHousemasterVo = new RoomValueWeekItemExcelVo();
+            maleHousemasterVo.setColumn1("男生留宿情况");
+            maleHousemasterVo.setColumn2("女生留宿情况");
+            maleHousemasterVo.setColumn3("男生宿管");
+            maleHousemasterVo.setColumn4(maleHousemaster);
+            itemList.add(maleHousemasterVo);
 
+            RoomValueWeekItemExcelVo femaleHousemasterVo = new RoomValueWeekItemExcelVo();
+            femaleHousemasterVo.setColumn1(maleStudents + "");
+            femaleHousemasterVo.setColumn2(femaleStudents + "");
+            femaleHousemasterVo.setColumn3("女生宿管");
+            femaleHousemasterVo.setColumn4(femaleHousemaster);
+            itemList.add(femaleHousemasterVo);
 
+            RoomValueWeekItemExcelVo instructorVo = new RoomValueWeekItemExcelVo();
+            instructorVo.setColumn1(maleStudents + "");
+            instructorVo.setColumn2(femaleStudents + "");
+            instructorVo.setColumn3("教官");
+            instructorVo.setColumn4(instructor);
+            itemList.add(instructorVo);
 
-        return null;
+            weekExcelVo.setItemList(itemList);
+        }
+
+        return dataList;
     }
 
     @Override

+ 7 - 7
src/main/java/com/xjrsoft/module/room/vo/RoomValueWeekItemExcelVo.java

@@ -14,19 +14,19 @@ import lombok.Data;
 public class RoomValueWeekItemExcelVo {
 
     @ExcelProperty(index = 0)
-    @ColumnWidth(15)
+    @ColumnWidth(20)
     private String column1;
 
-    @ExcelProperty(index = 0)
-    @ColumnWidth(15)
+    @ExcelProperty(index = 1)
+    @ColumnWidth(20)
     private String column2;
 
-    @ExcelProperty(index = 0)
-    @ColumnWidth(15)
+    @ExcelProperty(index = 2)
+    @ColumnWidth(20)
     private String column3;
 
-    @ExcelProperty(index = 0)
-    @ColumnWidth(15)
+    @ExcelProperty(index = 3)
+    @ColumnWidth(20)
     private String column4;
 
 }

+ 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);
                 }
             }

+ 1 - 1
src/main/java/com/xjrsoft/module/textbook/dto/TeacherCheckByStuDto.java

@@ -26,7 +26,7 @@ public class TeacherCheckByStuDto extends PageInput {
     @ApiModelProperty(value = "班级编号")
     private List<Long> classIdList;
     /**
-     * 领取情况(1=全部数据,2=该教材全部领取,3=该教材部分未领取)
+     * 领取情况(1=全部数据,2=该学生教材全部领取,3=该学生教材部分未领取)
      */
     @ApiModelProperty("领取情况")
     private Integer claimStatus;

+ 1 - 2
src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookStudentClaimServiceImpl.java

@@ -130,7 +130,7 @@ public class TextbookStudentClaimServiceImpl extends MPJBaseServiceImpl<Textbook
             MPJLambdaWrapper<WfTextbookClaim> qweryActualReceivedNum = new MPJLambdaWrapper<>();
             qweryActualReceivedNum
                     .disableSubLogicDel()
-                    .selectAs(WfTextbookClaimItem::getIssueNumber, TeacherCheckByclassVo::getActualReceivedNum)
+                    .selectSum(WfTextbookClaimItem::getIssueNumber, TeacherCheckByclassVo::getActualReceivedNum)
                     .leftJoin(WfTextbookClaimItem.class, WfTextbookClaimItem::getWfTextbookClaimId, WfTextbookClaim::getId)
                     .eq(WfTextbookClaim::getClassId, t.getClassId())
                     .eq(WfTextbookClaimItem::getTextbookId, t.getTextbookId());
@@ -173,7 +173,6 @@ public class TextbookStudentClaimServiceImpl extends MPJBaseServiceImpl<Textbook
             List<TextbookClaimVO> textbookClaimVOList = textbookStudentClaimMapper.getTextbookClaimVOList(t.getStudentUserId());
             t.setTextbookClaimVOList(textbookClaimVOList);
         }
-
         return teacherCheckByStuVoList;
     }
 

+ 6 - 2
src/main/java/com/xjrsoft/module/textbook/service/impl/WfTextbookClaimServiceImpl.java

@@ -138,8 +138,12 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
                 List<XjrUser> xjrUserList = xjrUserMapper.selectList(queryWrapper);
                 if (ObjectUtil.isNotNull(xjrUserList) && xjrUserList.size() > 0) {
                     StringBuilder sb = new StringBuilder();
-                    for (XjrUser xjrUser : xjrUserList) {
-                        sb.append("," + xjrUser.getName());
+                    for (int i = 0; i < xjrUserList.size(); i++) {
+                        if(i == 0){
+                            sb.append(xjrUserList.get(i).getName());
+                        }else{
+                            sb.append("," + xjrUserList.get(i).getName());
+                        }
                     }
                     wfTextbookClaimPageVo.setReceiveUserIdCN(sb.toString());
                 }

+ 10 - 0
src/main/java/com/xjrsoft/module/textbook/service/impl/WfTextbookRecedeServiceImpl.java

@@ -1,5 +1,6 @@
 package com.xjrsoft.module.textbook.service.impl;
 
+import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -14,6 +15,7 @@ import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
@@ -112,11 +114,15 @@ public class WfTextbookRecedeServiceImpl extends MPJBaseServiceImpl<WfTextbookRe
                     if(ObjectUtil.isNotNull(textbook) && wfTextbookRecede.getRecedeType().equals(RecedeTypeEnum.RecedeDeansOffice.getCode())){
                         //修改库存
                         textbookTextbookMapper.updateById(new Textbook(){{
+                            setModifyUserId(StpUtil.getLoginIdAsLong());
+                            setModifyDate(new Date());
                             setId(wfTextbookRecedeItem.getTextbookId());
                             setStock((ObjectUtil.isNull(textbook.getStock())?0:textbook.getStock()) + (ObjectUtil.isNull(wfTextbookRecedeItem.getNumber())?0:wfTextbookRecedeItem.getNumber()));
                         }});
                         //增加入库记录
                         textbookWarehouseRecordMapper.insert(new TextbookWarehouseRecord(){{
+                            setCreateUserId(StpUtil.getLoginIdAsLong());
+                            setCreateDate(new Date());
                             setTextbookId(wfTextbookRecedeItem.getTextbookId());
                             setDataId(wfTextbookRecede.getId());
                             setDataItemId(wfTextbookRecedeItem.getId());
@@ -129,11 +135,15 @@ public class WfTextbookRecedeServiceImpl extends MPJBaseServiceImpl<WfTextbookRe
                     if(ObjectUtil.isNotNull(textbook) && wfTextbookRecede.getRecedeType().equals(RecedeTypeEnum.RecedeBookstore.getCode())){
                         //修改库存
                         textbookTextbookMapper.updateById(new Textbook(){{
+                            setModifyUserId(StpUtil.getLoginIdAsLong());
+                            setModifyDate(new Date());
                             setId(wfTextbookRecedeItem.getTextbookId());
                             setStock((ObjectUtil.isNull(textbook.getStock())?0:textbook.getStock()) - (ObjectUtil.isNull(wfTextbookRecedeItem.getNumber())?0:wfTextbookRecedeItem.getNumber()) );
                         }});
                         //增加出库记录
                         textbookIssueRecordMapper.insert(new TextbookIssueRecord(){{
+                            setCreateUserId(StpUtil.getLoginIdAsLong());
+                            setCreateDate(new Date());
                             setTextbookId(wfTextbookRecedeItem.getTextbookId());
                             setDataId(wfTextbookRecede.getId());
                             setDataItemId(wfTextbookRecedeItem.getId());

+ 5 - 1
src/main/resources/mapper/room/RoomBedMapper.xml

@@ -222,7 +222,11 @@
             and t2.floor_number = #{dto.floorNumber}
         </if>
         <if test="dto.classId != null">
-            and t7.class_id = #{dto.classId}
+            AND t2.id IN (
+            SELECT DISTINCT c1.room_id FROM room_bed c1
+            INNER JOIN base_student_school_roll c2 ON c1.student_user_id = c2.user_id
+            WHERE c2.class_id = #{dto.classId}
+            )
         </if>
         <if test="dto.buildId != null">
             and t3.id = #{dto.buildId}

+ 1 - 0
src/main/resources/mapper/textbook/TextbookMapper.xml

@@ -48,6 +48,7 @@
         <if test="dto.publishingHouse != null and dto.publishingHouse != ''">
             and t1.publishing_house like concat('%', #{dto.publishingHouse}, '%')
         </if>
+        order by t3.name desc
     </select>
 
     <select id="subscriptionList" resultType="com.xjrsoft.module.textbook.vo.TextbookSubscriptionRecordVo">

+ 9 - 4
src/main/resources/mapper/textbook/TextbookStudentClaimMapper.xml

@@ -73,17 +73,22 @@
         t1.student_id as studentId
         FROM xjr_user t
         LEFT JOIN base_student t1 ON (t1.user_id = t.id)
-        where t.id in (SELECT student_user_id
-        FROM textbook_student_claim
+        where t.id in (SELECT distinct student_user_id
+        FROM textbook_student_claim t
         WHERE delete_mark = 0
+        <if test="dto.claimStatus != null and dto.claimStatus == 3">
+            and (select count(*) from textbook_student_claim where is_claim = 1 and student_user_id = t.student_user_id) != (select count(*) from textbook_student_claim where student_user_id = t.student_user_id)
+        </if>
+        <if test="dto.claimStatus != null and dto.claimStatus == 2">
+            and (select count(*) from textbook_student_claim where is_claim = 1 and student_user_id = t.student_user_id) = (select count(*) from textbook_student_claim where student_user_id = t.student_user_id)
+        </if>
         <if test="dto.classIdList != null and dto.classIdList.size() > 0">
             and class_id in
             <foreach item="classId" index="index" collection="dto.classIdList" open="(" close=")"
                      separator=",">
                 #{classId}
             </foreach>
-        </if>
-        GROUP BY student_user_id)
+        </if>)
         <if test="dto.studentUserId != null and dto.studentUserId != 0 and dto.studentUserId != ''">
             and t.id = #{dto.studentUserId}
         </if>

+ 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));
+    }
 }