TRX 1 år sedan
förälder
incheckning
8031f60630
23 ändrade filer med 922 tillägg och 0 borttagningar
  1. 3 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/base/SuperModel.java
  2. 9 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/base/SuperParam.java
  3. 25 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/school/NoticeInfoAddParam.java
  4. 34 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/school/NoticeInfoModel.java
  5. 22 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/school/NoticeInfoSearchParam.java
  6. 18 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/school/NoticeInfoViewAddParam.java
  7. 24 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/school/NoticeInfoViewModel.java
  8. 18 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/school/NoticeInfoViewSearch.java
  9. 28 0
      FullCardClient/src/main/java/com/zhongshu/card/client/service/school/NoticeInfoService.java
  10. 65 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/school/CardController.java
  11. 92 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/school/NoticeController.java
  12. 18 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/NoticeInfoDao.java
  13. 17 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/NoticeInfoViewDao.java
  14. 17 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/extend/NoticeInfoDaoExtend.java
  15. 17 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/extend/NoticeInfoViewDaoExtend.java
  16. 77 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/impl/NoticeInfoDaoImpl.java
  17. 57 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/impl/NoticeInfoViewDaoImpl.java
  18. 6 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/base/SuperMain.java
  19. 47 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/school/NoticeInfo.java
  20. 33 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/school/NoticeInfoView.java
  21. 1 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/base/CommonService.java
  22. 98 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/base/SuperService.java
  23. 196 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/school/NoticeInfoServiceImpl.java

+ 3 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/base/SuperModel.java

@@ -35,4 +35,7 @@ public class SuperModel implements Serializable {
 
     @Schema(description = "所属机构ID")
     private String oid;
+
+    @Schema(description = "添加用户名称")
+    private String createUserName;
 }

+ 9 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/base/SuperParam.java

@@ -24,4 +24,13 @@ public class SuperParam implements Serializable {
 
     @Schema(description = "备注")
     private String remark;
+
+    @Schema(description = "创建用户ID", hidden = true)
+    private String createUserId;
+
+    @Schema(description = "添加用户名称", hidden = true)
+    private String createUserName;
+
+    @Schema(description = "添加用户电话", hidden = true)
+    private String createPhone;
 }

+ 25 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/school/NoticeInfoAddParam.java

@@ -0,0 +1,25 @@
+package com.zhongshu.card.client.model.school;
+
+import com.zhongshu.card.client.model.base.SuperParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author TRX
+ * @date 2024/6/7
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class NoticeInfoAddParam extends SuperParam {
+    @Schema(description = "标题")
+    private String title;
+
+    @Schema(description = "内容")
+    private String content;
+
+    @Schema(description = "发布对象")
+    private String author;
+}

+ 34 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/school/NoticeInfoModel.java

@@ -0,0 +1,34 @@
+package com.zhongshu.card.client.model.school;
+
+import com.zhongshu.card.client.model.base.SuperModel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author TRX
+ * @date 2024/6/7
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class NoticeInfoModel extends SuperModel {
+    @Schema(description = "标题")
+    private String title;
+
+    @Schema(description = "内容")
+    private String content;
+
+    @Schema(description = "发布对象")
+    private String author;
+
+    @Schema(description = "阅读次数")
+    private Long viewTimes = 0L;
+
+    @Schema(description = "是否置顶")
+    private Boolean isTopping = Boolean.FALSE;
+
+    @Schema(description = "置顶时间")
+    private Long toppingTime = 0L;
+}

+ 22 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/school/NoticeInfoSearchParam.java

@@ -0,0 +1,22 @@
+package com.zhongshu.card.client.model.school;
+
+import com.zhongshu.card.client.model.base.SuperSearch;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author TRX
+ * @date 2024/6/7
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class NoticeInfoSearchParam extends SuperSearch {
+    @Schema(description = "标题")
+    private String title;
+
+    @Schema(description = "添加用户")
+    private String createUserId;
+}

+ 18 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/school/NoticeInfoViewAddParam.java

@@ -0,0 +1,18 @@
+package com.zhongshu.card.client.model.school;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author TRX
+ * @date 2024/6/7
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class NoticeInfoViewAddParam {
+    @Schema(description = "公告ID")
+    private String id;
+}

+ 24 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/school/NoticeInfoViewModel.java

@@ -0,0 +1,24 @@
+package com.zhongshu.card.client.model.school;
+
+import com.zhongshu.card.client.model.base.SuperModel;
+import com.zhongshu.card.client.model.org.UserCountModel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author TRX
+ * @date 2024/6/7
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class NoticeInfoViewModel extends SuperModel {
+
+    @Schema(description = "公告信息")
+    private NoticeInfoModel noticeInfo;
+
+    @Schema(description = "用户信息")
+    private UserCountModel userCount;
+}

+ 18 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/school/NoticeInfoViewSearch.java

@@ -0,0 +1,18 @@
+package com.zhongshu.card.client.model.school;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author TRX
+ * @date 2024/6/7
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class NoticeInfoViewSearch{
+    @Schema(description = "公告ID")
+    private String noticeInfoId;
+}

+ 28 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/service/school/NoticeInfoService.java

@@ -0,0 +1,28 @@
+package com.zhongshu.card.client.service.school;
+
+import com.zhongshu.card.client.model.school.*;
+import com.zhongshu.card.client.ret.ResultContent;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+
+/**
+ * @author TRX
+ * @date 2024/6/7
+ */
+public interface NoticeInfoService {
+
+    ResultContent addNoticeInfo(NoticeInfoAddParam param);
+
+    ResultContent deleteNoticeInfo(String id);
+
+    // 置顶
+    ResultContent topping(String id);
+
+    ResultContent<NoticeInfoModel> getDetail(String id);
+
+    ResultContent addView(String id);
+
+    ResultContent<Page<NoticeInfoModel>> page(NoticeInfoSearchParam param, Pageable pageable);
+
+    ResultContent<Page<NoticeInfoViewModel>> pageView(NoticeInfoViewSearch param, Pageable pageable);
+}

+ 65 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/school/CardController.java

@@ -0,0 +1,65 @@
+package com.zhongshu.card.server.core.controller.school;
+
+import com.github.microservice.auth.security.annotations.ResourceAuth;
+import com.github.microservice.auth.security.type.AuthType;
+import com.zhongshu.card.client.model.base.IDParam;
+import com.zhongshu.card.client.model.org.RoleAddParam;
+import com.zhongshu.card.client.model.org.RoleModel;
+import com.zhongshu.card.client.model.org.RoleSearchParam;
+import com.zhongshu.card.client.ret.ResultContent;
+import com.zhongshu.card.server.core.service.org.RoleServiceImpl;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author TRX
+ * @date 2024/6/5
+ */
+@RestController
+@RequestMapping("card")
+@Tag(name = "学校-卡务中心")
+public class CardController {
+
+    @Autowired
+    RoleServiceImpl roleService;
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "添加-编辑角色", description = "添加-编辑角色")
+    @RequestMapping(value = "addRole", method = {RequestMethod.POST})
+    public ResultContent addRole(@RequestBody RoleAddParam param) {
+        return this.roleService.addRole(param);
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "角色列表-分页查询", description = "角色列表-分页查询")
+    @RequestMapping(value = {"page"}, method = {RequestMethod.POST})
+    public ResultContent<Page<RoleModel>> page(
+            @Parameter(hidden = true) @PageableDefault(page = 0, size = 10) Pageable pageable,
+            @Parameter(required = false) RoleSearchParam param) {
+        return roleService.page(param, pageable);
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "删除角色", description = "删除角色")
+    @RequestMapping(value = "deleteRole", method = {RequestMethod.POST})
+    public ResultContent deleteRole(@RequestBody IDParam param) {
+        return this.roleService.deleteRole(param.getId());
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "角色详情", description = "角色详情")
+    @RequestMapping(value = "getRole", method = {RequestMethod.POST})
+    public ResultContent<RoleModel> getRole(@RequestBody IDParam param) {
+        return this.roleService.getRole(param.getId());
+    }
+
+}

+ 92 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/school/NoticeController.java

@@ -0,0 +1,92 @@
+package com.zhongshu.card.server.core.controller.school;
+
+import com.github.microservice.auth.security.annotations.ResourceAuth;
+import com.github.microservice.auth.security.type.AuthType;
+import com.zhongshu.card.client.model.base.IDParam;
+import com.zhongshu.card.client.model.org.RoleAddParam;
+import com.zhongshu.card.client.model.org.RoleModel;
+import com.zhongshu.card.client.model.org.RoleSearchParam;
+import com.zhongshu.card.client.model.school.*;
+import com.zhongshu.card.client.ret.ResultContent;
+import com.zhongshu.card.client.service.school.NoticeInfoService;
+import com.zhongshu.card.server.core.service.org.RoleServiceImpl;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author TRX
+ * @date 2024/6/5
+ */
+@RestController
+@RequestMapping("notice")
+@Tag(name = "学校-校园公告")
+public class NoticeController {
+
+    @Autowired
+    RoleServiceImpl roleService;
+
+    @Autowired
+    NoticeInfoService noticeInfoService;
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "添加-编辑公告", description = "添加-编辑公告")
+    @RequestMapping(value = "addNoticeInfo", method = {RequestMethod.POST})
+    public ResultContent addNoticeInfo(@RequestBody NoticeInfoAddParam param) {
+        return this.noticeInfoService.addNoticeInfo(param);
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "删除公告", description = "删除公告")
+    @RequestMapping(value = "deleteNoticeInfo", method = {RequestMethod.POST})
+    public ResultContent deleteNoticeInfo(@RequestBody IDParam param) {
+        return this.noticeInfoService.deleteNoticeInfo(param.getId());
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "置顶公告", description = "置顶公告")
+    @RequestMapping(value = "topping", method = {RequestMethod.POST})
+    public ResultContent topping(@RequestBody IDParam param) {
+        return this.noticeInfoService.topping(param.getId());
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "公告详情", description = "公告详情")
+    @RequestMapping(value = "getDetail", method = {RequestMethod.POST})
+    public ResultContent<NoticeInfoModel> getDetail(@RequestBody IDParam param) {
+        return this.noticeInfoService.getDetail(param.getId());
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "公告增加阅读量", description = "公告增加阅读量")
+    @RequestMapping(value = "addView", method = {RequestMethod.POST})
+    public ResultContent addView(@RequestBody IDParam param) {
+        return this.noticeInfoService.addView(param.getId());
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "公告列表-分页查询", description = "公告列表-分页查询")
+    @RequestMapping(value = {"page"}, method = {RequestMethod.POST})
+    public ResultContent<Page<NoticeInfoModel>> page(
+            @Parameter(hidden = true) @PageableDefault(page = 0, size = 10) Pageable pageable,
+            @Parameter(required = false) NoticeInfoSearchParam param) {
+        return noticeInfoService.page(param, pageable);
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "公告阅读量列表-分页查询", description = "公告阅读量-分页查询")
+    @RequestMapping(value = {"pageView"}, method = {RequestMethod.POST})
+    public ResultContent<Page<NoticeInfoViewModel>> pageView(
+            @Parameter(hidden = true) @PageableDefault(page = 0, size = 10) Pageable pageable,
+            @Parameter(required = false) NoticeInfoViewSearch param) {
+        return noticeInfoService.pageView(param, pageable);
+    }
+}

+ 18 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/NoticeInfoDao.java

@@ -0,0 +1,18 @@
+package com.zhongshu.card.server.core.dao.school;
+
+import com.github.microservice.components.data.mongo.mongo.dao.MongoDao;
+import com.zhongshu.card.server.core.dao.school.extend.NoticeInfoDaoExtend;
+import com.zhongshu.card.server.core.domain.org.Department;
+import com.zhongshu.card.server.core.domain.school.NoticeInfo;
+
+import java.util.List;
+
+/**
+ * @author TRX
+ * @date 2024/3/21
+ */
+public interface NoticeInfoDao extends MongoDao<NoticeInfo>, NoticeInfoDaoExtend {
+
+    NoticeInfo findTopById(String id);
+
+}

+ 17 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/NoticeInfoViewDao.java

@@ -0,0 +1,17 @@
+package com.zhongshu.card.server.core.dao.school;
+
+import com.github.microservice.components.data.mongo.mongo.dao.MongoDao;
+import com.zhongshu.card.server.core.dao.school.extend.NoticeInfoViewDaoExtend;
+import com.zhongshu.card.server.core.domain.org.Department;
+import com.zhongshu.card.server.core.domain.school.NoticeInfo;
+import com.zhongshu.card.server.core.domain.school.NoticeInfoView;
+
+/**
+ * @author TRX
+ * @date 2024/3/21
+ */
+public interface NoticeInfoViewDao extends MongoDao<NoticeInfoView>, NoticeInfoViewDaoExtend {
+
+    NoticeInfoView findTopById(String id);
+
+}

+ 17 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/extend/NoticeInfoDaoExtend.java

@@ -0,0 +1,17 @@
+package com.zhongshu.card.server.core.dao.school.extend;
+
+import com.zhongshu.card.client.model.org.OrganizationSearchParam;
+import com.zhongshu.card.client.model.school.NoticeInfoSearchParam;
+import com.zhongshu.card.server.core.domain.org.Organization;
+import com.zhongshu.card.server.core.domain.school.NoticeInfo;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+
+/**
+ * @Author TRX
+ * @CreateDate: 2023/7/7
+ * @Version: 1.0
+ */
+public interface NoticeInfoDaoExtend {
+    Page<NoticeInfo> page(Pageable pageable, NoticeInfoSearchParam param);
+}

+ 17 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/extend/NoticeInfoViewDaoExtend.java

@@ -0,0 +1,17 @@
+package com.zhongshu.card.server.core.dao.school.extend;
+
+import com.zhongshu.card.client.model.school.NoticeInfoSearchParam;
+import com.zhongshu.card.client.model.school.NoticeInfoViewSearch;
+import com.zhongshu.card.server.core.domain.school.NoticeInfo;
+import com.zhongshu.card.server.core.domain.school.NoticeInfoView;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+
+/**
+ * @Author TRX
+ * @CreateDate: 2023/7/7
+ * @Version: 1.0
+ */
+public interface NoticeInfoViewDaoExtend {
+    Page<NoticeInfoView> page(Pageable pageable, NoticeInfoViewSearch param);
+}

+ 77 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/impl/NoticeInfoDaoImpl.java

@@ -0,0 +1,77 @@
+package com.zhongshu.card.server.core.dao.school.impl;
+
+import com.github.microservice.components.data.mongo.mongo.helper.DBHelper;
+import com.zhongshu.card.client.model.org.OrganizationSearchParam;
+import com.zhongshu.card.client.model.school.NoticeInfoSearchParam;
+import com.zhongshu.card.server.core.dao.BaseImpl;
+import com.zhongshu.card.server.core.dao.org.extend.OrganizationDaoExtend;
+import com.zhongshu.card.server.core.dao.school.extend.NoticeInfoDaoExtend;
+import com.zhongshu.card.server.core.domain.org.Organization;
+import com.zhongshu.card.server.core.domain.school.NoticeInfo;
+import com.zhongshu.card.server.core.util.CommonUtil;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Pattern;
+
+/**
+ * @Author TRX
+ * @CreateDate: 2023/4/12
+ * @Version: 1.0
+ */
+public class NoticeInfoDaoImpl extends BaseImpl implements NoticeInfoDaoExtend {
+
+    @Autowired
+    private MongoTemplate mongoTemplate;
+
+    @Autowired
+    private DBHelper dbHelper;
+
+    @Override
+    public Page<NoticeInfo> page(Pageable pageable, NoticeInfoSearchParam param) {
+        Criteria criteria = new Criteria();
+
+        // 学校ID
+        if (ObjectUtils.isNotEmpty(param.getOid())) {
+            criteria.and("oid").is(param.getOid());
+        }
+
+        if (ObjectUtils.isNotEmpty(param.getCreateUserId())) {
+            criteria.and("createUserId").is(param.getCreateUserId());
+        }
+
+        if (!CommonUtil.longIsEmpty(param.getStartTime()) && !CommonUtil.longIsEmpty(param.getEndTime())) {
+            criteria.and("createTime").gte(param.getStartTime()).and("createTime").lte(param.getEndTime());
+        }
+
+        // 模糊搜索
+        List<Criteria> criterias = new ArrayList<>();
+        if (StringUtils.isNotEmpty(param.getTitle())) {
+            Pattern pattern = Pattern.compile("^.*" + param.getTitle() + ".*$");
+            criterias.add(Criteria.where("title").is(pattern));
+        }
+        if (!CollectionUtils.isEmpty(criterias)) {
+            criteria.andOperator(criterias.toArray(new Criteria[]{}));
+        }
+        criteria.and("isDelete").is(Boolean.FALSE);
+
+        Sort sort = Sort.by(
+                Sort.Order.desc("toppingTime"),
+                Sort.Order.desc("createTime")
+        );
+        Query query = Query.query(criteria);
+        query.with(sort);
+        return dbHelper.pages(query, pageable, NoticeInfo.class);
+    }
+
+}

+ 57 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/impl/NoticeInfoViewDaoImpl.java

@@ -0,0 +1,57 @@
+package com.zhongshu.card.server.core.dao.school.impl;
+
+import com.github.microservice.components.data.mongo.mongo.helper.DBHelper;
+import com.zhongshu.card.client.model.school.NoticeInfoSearchParam;
+import com.zhongshu.card.client.model.school.NoticeInfoViewSearch;
+import com.zhongshu.card.server.core.dao.BaseImpl;
+import com.zhongshu.card.server.core.dao.school.extend.NoticeInfoDaoExtend;
+import com.zhongshu.card.server.core.dao.school.extend.NoticeInfoViewDaoExtend;
+import com.zhongshu.card.server.core.domain.school.NoticeInfo;
+import com.zhongshu.card.server.core.domain.school.NoticeInfoView;
+import com.zhongshu.card.server.core.util.CommonUtil;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Pattern;
+
+/**
+ * @Author TRX
+ * @CreateDate: 2023/4/12
+ * @Version: 1.0
+ */
+public class NoticeInfoViewDaoImpl extends BaseImpl implements NoticeInfoViewDaoExtend {
+
+    @Autowired
+    private MongoTemplate mongoTemplate;
+
+    @Autowired
+    private DBHelper dbHelper;
+
+    @Override
+    public Page<NoticeInfoView> page(Pageable pageable, NoticeInfoViewSearch param) {
+        Criteria criteria = new Criteria();
+
+        //
+        if (ObjectUtils.isNotEmpty(param.getNoticeInfoId())) {
+            criteria.and("noticeInfo").is(NoticeInfo.build(param.getNoticeInfoId()));
+        }
+        criteria.and("isDelete").is(Boolean.FALSE);
+        Sort sort = Sort.by(
+                Sort.Order.desc("createTime")
+        );
+        Query query = Query.query(criteria);
+        query.with(sort);
+        return dbHelper.pages(query, pageable, NoticeInfoView.class);
+    }
+
+}

+ 6 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/base/SuperMain.java

@@ -25,4 +25,10 @@ public class SuperMain extends SuperEntity {
 
     @Schema(description = "创建用户ID")
     private String createUserId;
+
+    @Schema(description = "添加用户名称")
+    private String createUserName;
+
+    @Schema(description = "添加用户电话", hidden = true)
+    private String createPhone;
 }

+ 47 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/school/NoticeInfo.java

@@ -0,0 +1,47 @@
+package com.zhongshu.card.server.core.domain.school;
+
+import com.zhongshu.card.server.core.domain.base.SuperMain;
+import com.zhongshu.card.server.core.domain.org.Role;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.checkerframework.common.aliasing.qual.NonLeaked;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+/**
+ * 学校公告
+ *
+ * @author TRX
+ * @date 2024/6/7
+ */
+@Data
+@Document
+@AllArgsConstructor
+@NoArgsConstructor
+@NonLeaked
+public class NoticeInfo extends SuperMain {
+    @Schema(description = "标题")
+    private String title;
+
+    @Schema(description = "内容")
+    private String content;
+
+    @Schema(description = "发布对象")
+    private String author;
+
+    @Schema(description = "阅读次数")
+    private Long viewTimes = 0L;
+
+    @Schema(description = "是否置顶")
+    private Boolean isTopping = Boolean.FALSE;
+
+    @Schema(description = "置顶时间")
+    private Long toppingTime = 0L;
+
+    public static NoticeInfo build(String id) {
+        NoticeInfo entity = new NoticeInfo();
+        entity.setId(id);
+        return entity;
+    }
+}

+ 33 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/school/NoticeInfoView.java

@@ -0,0 +1,33 @@
+package com.zhongshu.card.server.core.domain.school;
+
+import com.zhongshu.card.server.core.domain.base.SuperMain;
+import com.zhongshu.card.server.core.domain.org.UserAccount;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.checkerframework.common.aliasing.qual.NonLeaked;
+import org.springframework.data.mongodb.core.mapping.DBRef;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+/**
+ * 学校公告 阅览记录
+ *
+ * @author TRX
+ * @date 2024/6/7
+ */
+@Data
+@Document
+@AllArgsConstructor
+@NoArgsConstructor
+@NonLeaked
+public class NoticeInfoView extends SuperMain {
+
+    @Schema(description = "公告信息")
+    @DBRef(lazy = true)
+    private NoticeInfo noticeInfo;
+
+    @Schema(description = "关联用户信息")
+    private UserAccount userAccount;
+
+}

+ 1 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/base/CommonService.java

@@ -25,6 +25,7 @@ public class CommonService {
 
     /**
      * 编辑数据
+     *
      * @param standardData
      * @param collectionName
      * @return

+ 98 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/base/SuperService.java

@@ -1,7 +1,18 @@
 package com.zhongshu.card.server.core.service.base;
 
 import com.github.microservice.auth.security.helper.AuthHelper;
+import com.zhongshu.card.client.model.base.SuperParam;
+import com.zhongshu.card.client.model.base.SuperSearch;
+import com.zhongshu.card.server.core.dao.org.UserCountDao;
+import com.zhongshu.card.server.core.domain.base.SuperMain;
+import com.zhongshu.card.server.core.domain.org.UserAccount;
+import com.zhongshu.card.server.core.util.DateUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.Assert;
+
+import java.util.List;
 
 /**
  * @author TRX
@@ -12,8 +23,12 @@ public abstract class SuperService {
     @Autowired
     private AuthHelper authHelper;
 
+    @Autowired
+    UserCountDao userCountDao;
+
     /**
      * 得到当前的用户ID
+     *
      * @return
      */
     public String getCurrentUserId() {
@@ -23,8 +38,23 @@ public abstract class SuperService {
         return null;
     }
 
+    /**
+     * 得到当前用户 UserAccount 信息
+     *
+     * @return
+     */
+    public UserAccount getCurrentUserAccount() {
+        UserAccount account = null;
+        String userId = getCurrentUserId();
+        if (StringUtils.isNotEmpty(userId)) {
+            account = userCountDao.findTopByUserId(userId);
+        }
+        return account;
+    }
+
     /**
      * 得到当前的Oid
+     *
      * @return
      */
     public String getCurrentOid() {
@@ -34,4 +64,72 @@ public abstract class SuperService {
         return null;
     }
 
+    /**
+     * 初始Entity的默认参数 oid、createUser (oid为空会抛出异常)
+     *
+     * @param entity
+     */
+    public void initEntity(SuperMain entity) {
+        if (entity != null) {
+            String oid = entity.getOid();
+            if (StringUtils.isEmpty(oid)) {
+                entity.setOid(getCurrentOid());
+            }
+            Assert.hasText(entity.getOid(), "oid不能为空");
+
+            if (authHelper != null && authHelper.getCurrentUser() != null) {
+                entity.setCreateUserId(authHelper.getCurrentUser().getUserId());
+                entity.setCreateUserName(authHelper.getCurrentUser().getUserName());
+                entity.setCreateUserName(authHelper.getCurrentUser().getPhone());
+            }
+        }
+    }
+
+    /**
+     * 填充当前用户和oid信息 (oid为空会抛出异常)
+     *
+     * @param param
+     */
+    public void initDefaultUserAndOid(SuperParam param) {
+        initDefaultParam(param);
+        initOid(param);
+    }
+
+    public void initDefaultParam(SuperParam param) {
+        if (authHelper != null && authHelper.getCurrentUser() != null) {
+            param.setCreateUserId(authHelper.getCurrentUser().getUserId());
+            param.setCreateUserName(authHelper.getCurrentUser().getUserName());
+            param.setCreateUserName(authHelper.getCurrentUser().getPhone());
+        }
+    }
+
+    public void initOid(SuperParam param) {
+        String oid = param.getOid();
+        if (StringUtils.isEmpty(oid)) {
+            param.setOid(getCurrentOid());
+        }
+        Assert.hasText(param.getOid(), "oid不能为空");
+    }
+
+    /**
+     * 初始填充搜索 oid times
+     *
+     * @param param
+     */
+    public void initOidSearchParam(SuperSearch param) {
+        String oid = param.getOid();
+        if (StringUtils.isEmpty(oid)) {
+            param.setOid(getCurrentOid());
+        }
+        Assert.hasText(param.getOid(), "oid不能为空");
+        List<Long> times = param.getTimes();
+        if (ObjectUtils.isNotEmpty(times) && times.size() == 2) {
+            Long startTime = times.get(0);
+            startTime = DateUtils.getDayStartTime(startTime);
+            Long endTime = times.get(1);
+            endTime = DateUtils.getDayEndTime(endTime);
+            param.setStartTime(startTime);
+            param.setEndTime(endTime);
+        }
+    }
 }

+ 196 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/school/NoticeInfoServiceImpl.java

@@ -0,0 +1,196 @@
+package com.zhongshu.card.server.core.service.school;
+
+import com.github.microservice.components.data.base.util.PageEntityUtil;
+import com.zhongshu.card.client.model.org.RoleModel;
+import com.zhongshu.card.client.model.org.RoleSearchParam;
+import com.zhongshu.card.client.model.school.*;
+import com.zhongshu.card.client.ret.ResultContent;
+import com.zhongshu.card.client.ret.ResultMessage;
+import com.zhongshu.card.client.service.school.NoticeInfoService;
+import com.zhongshu.card.server.core.dao.org.OrganizationDao;
+import com.zhongshu.card.server.core.dao.org.UserCountDao;
+import com.zhongshu.card.server.core.dao.school.NoticeInfoDao;
+import com.zhongshu.card.server.core.dao.school.NoticeInfoViewDao;
+import com.zhongshu.card.server.core.domain.org.Role;
+import com.zhongshu.card.server.core.domain.school.NoticeInfo;
+import com.zhongshu.card.server.core.domain.school.NoticeInfoView;
+import com.zhongshu.card.server.core.service.base.CommonService;
+import com.zhongshu.card.server.core.service.base.SuperService;
+import com.zhongshu.card.server.core.service.org.UserAccountServiceImpl;
+import com.zhongshu.card.server.core.util.BeanUtils;
+import com.zhongshu.card.server.core.util.CommonUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.stereotype.Service;
+import org.springframework.util.Assert;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author TRX
+ * @date 2024/6/7
+ */
+@Slf4j
+@Service
+public class NoticeInfoServiceImpl extends SuperService implements NoticeInfoService {
+
+    @Autowired
+    private UserCountDao userCountDao;
+
+    @Autowired
+    private OrganizationDao organizationDao;
+
+    @Autowired
+    NoticeInfoDao noticeInfoDao;
+
+    @Autowired
+    NoticeInfoViewDao noticeInfoViewDao;
+
+    @Autowired
+    UserAccountServiceImpl userService;
+
+    @Autowired
+    CommonService commonService;
+
+    /**
+     * 添加-编辑公告
+     *
+     * @param param
+     * @return
+     */
+    @Override
+    public ResultContent addNoticeInfo(NoticeInfoAddParam param) {
+        initDefaultUserAndOid(param);
+        NoticeInfo noticeInfo = new NoticeInfo();
+        if (StringUtils.isNotEmpty(param.getId())) {
+            noticeInfo = noticeInfoDao.findTopById(param.getId());
+            if (ObjectUtils.isEmpty(noticeInfo)) {
+                return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, param.getId()));
+            }
+        }
+        BeanUtils.copyProperties(param, noticeInfo);
+        noticeInfoDao.save(noticeInfo);
+        return ResultContent.buildSuccess();
+    }
+
+    /**
+     * 删除公告
+     *
+     * @param id
+     * @return
+     */
+    @Override
+    public ResultContent deleteNoticeInfo(String id) {
+        NoticeInfo noticeInfo = noticeInfoDao.findTopById(id);
+        if (ObjectUtils.isEmpty(noticeInfo)) {
+            return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, id));
+        }
+        noticeInfoDao.delete(noticeInfo);
+        return ResultContent.buildSuccess();
+    }
+
+    /**
+     * 置顶
+     *
+     * @param id
+     * @return
+     */
+    public ResultContent topping(String id) {
+        NoticeInfo noticeInfo = noticeInfoDao.findTopById(id);
+        if (ObjectUtils.isEmpty(noticeInfo)) {
+            return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, id));
+        }
+        noticeInfo.setIsTopping(Boolean.TRUE);
+        noticeInfo.setToppingTime(System.currentTimeMillis());
+        noticeInfoDao.save(noticeInfo);
+        return ResultContent.buildSuccess();
+    }
+
+    /**
+     * 查询公告详情
+     *
+     * @param id
+     * @return
+     */
+    public ResultContent<NoticeInfoModel> getDetail(String id) {
+        NoticeInfo noticeInfo = noticeInfoDao.findTopById(id);
+        if (ObjectUtils.isEmpty(noticeInfo)) {
+            return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, id));
+        }
+        NoticeInfoModel model = toModel(noticeInfo);
+        return ResultContent.buildSuccess(model);
+    }
+
+    /**
+     * 添加阅读量
+     *
+     * @param id
+     * @return
+     */
+    @Override
+    public ResultContent addView(String id) {
+        NoticeInfo noticeInfo = noticeInfoDao.findTopById(id);
+        if (ObjectUtils.isEmpty(noticeInfo)) {
+            return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, id));
+        }
+        Long viewTimes = noticeInfo.getViewTimes();
+        if (CommonUtil.longIsEmpty(viewTimes)) {
+            viewTimes = 0l;
+        }
+        viewTimes++;
+        Map<String, Object> standardData = new HashMap<>();
+        standardData.put("id", id);
+        standardData.put("viewTimes", viewTimes);
+        commonService.updateData(standardData, NoticeInfo.class.getSimpleName());
+
+        NoticeInfoView infoView = new NoticeInfoView();
+        initEntity(infoView);
+        infoView.setNoticeInfo(noticeInfo);
+        infoView.setUserAccount(getCurrentUserAccount());
+
+        return ResultContent.buildSuccess();
+    }
+
+    /**
+     * 分页查询
+     *
+     * @param param
+     * @param pageable
+     * @return
+     */
+    @Override
+    public ResultContent<Page<NoticeInfoModel>> page(NoticeInfoSearchParam param, Pageable pageable) {
+        initOidSearchParam(param);
+        Page<NoticeInfo> page = noticeInfoDao.page(pageable, param);
+        return ResultContent.buildSuccess(PageEntityUtil.concurrent2PageModel(page, this::toModel));
+    }
+
+    @Override
+    public ResultContent<Page<NoticeInfoViewModel>> pageView(NoticeInfoViewSearch param, Pageable pageable) {
+        Page<NoticeInfoView> page = noticeInfoViewDao.page(pageable, param);
+        return ResultContent.buildSuccess(PageEntityUtil.concurrent2PageModel(page, this::toViewModel));
+    }
+
+    public NoticeInfoModel toModel(NoticeInfo entity) {
+        NoticeInfoModel model = new NoticeInfoModel();
+        if (ObjectUtils.isNotEmpty(entity)) {
+            BeanUtils.copyProperties(entity, model);
+        }
+        return model;
+    }
+
+    public NoticeInfoViewModel toViewModel(NoticeInfoView entity) {
+        NoticeInfoViewModel model = new NoticeInfoViewModel();
+        if (ObjectUtils.isNotEmpty(entity)) {
+            BeanUtils.copyProperties(entity, model);
+            model.setUserCount(userService.toModel(entity.getUserAccount()));
+        }
+        return model;
+    }
+
+}