TRX 1 tahun lalu
induk
melakukan
2c67d3bae4
19 mengubah file dengan 800 tambahan dan 0 penghapusan
  1. 21 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/org/userGroup/UserGroupModel.java
  2. 17 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/org/userGroup/UserGroupParam.java
  3. 24 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/org/userGroup/UserGroupSearch.java
  4. 25 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/org/userGroup/UserGroupToUserAddParam.java
  5. 23 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/org/userGroup/UserGroupToUserModel.java
  6. 21 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/org/userGroup/UserGroupToUserSearch.java
  7. 1 0
      FullCardClient/src/main/java/com/zhongshu/card/client/type/device/PermissSettingType.java
  8. 120 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/org/UserGroupController.java
  9. 19 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/UserGroupDao.java
  10. 23 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/UserGroupToUserDao.java
  11. 17 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/extend/UserGroupDaoExtend.java
  12. 17 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/extend/UserGroupToUserDaoExtend.java
  13. 72 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/impl/UserGroupDaoImpl.java
  14. 65 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/impl/UserGroupToUserDaoImpl.java
  15. 40 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/devices/DeviceGroup.java
  16. 35 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/devices/DeviceGroupToDevice.java
  17. 36 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/org/UserGroup.java
  18. 38 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/org/UserGroupToUser.java
  19. 186 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/org/UserGroupService.java

+ 21 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/org/userGroup/UserGroupModel.java

@@ -0,0 +1,21 @@
+package com.zhongshu.card.client.model.org.userGroup;
+
+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/12/19
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserGroupModel extends SuperModel {
+
+    @Schema(description = "名称")
+    private String name;
+
+}

+ 17 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/org/userGroup/UserGroupParam.java

@@ -0,0 +1,17 @@
+package com.zhongshu.card.client.model.org.userGroup;
+
+import com.zhongshu.card.client.model.base.SuperParam;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author TRX
+ * @date 2024/12/19
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserGroupParam extends SuperParam {
+    private String name;
+}

+ 24 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/org/userGroup/UserGroupSearch.java

@@ -0,0 +1,24 @@
+package com.zhongshu.card.client.model.org.userGroup;
+
+import com.zhongshu.card.client.model.base.SuperSearch;
+import com.zhongshu.card.client.type.DataState;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author TRX
+ * @date 2024/12/19
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserGroupSearch extends SuperSearch {
+
+    @Schema(description = "分组名称")
+    private String name;
+
+    private DataState state;
+
+}

+ 25 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/org/userGroup/UserGroupToUserAddParam.java

@@ -0,0 +1,25 @@
+package com.zhongshu.card.client.model.org.userGroup;
+
+import jakarta.validation.constraints.NotEmpty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author TRX
+ * @date 2024/12/19
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserGroupToUserAddParam {
+
+    @NotEmpty
+    private String groupId;
+
+    private List<String> orgUserId = new ArrayList<String>();
+
+}

+ 23 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/org/userGroup/UserGroupToUserModel.java

@@ -0,0 +1,23 @@
+package com.zhongshu.card.client.model.org.userGroup;
+
+import com.zhongshu.card.client.model.org.OrganizationUserModel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author TRX
+ * @date 2024/12/19
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserGroupToUserModel {
+
+    @Schema(description = "所属用户分组ID")
+    private String id;
+
+    @Schema(description = "机构用户信息")
+    private OrganizationUserModel user;
+}

+ 21 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/org/userGroup/UserGroupToUserSearch.java

@@ -0,0 +1,21 @@
+package com.zhongshu.card.client.model.org.userGroup;
+
+import com.zhongshu.card.client.model.org.OrganizationUserSearch;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author TRX
+ * @date 2024/12/19
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserGroupToUserSearch extends OrganizationUserSearch {
+
+    @Schema(description = "所属用户分组ID")
+    private String groupId;
+
+}

+ 1 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/type/device/PermissSettingType.java

@@ -10,6 +10,7 @@ public enum PermissSettingType {
     Role("角色"),
     Org("机构"),
     Area("区域"),
+    UserGroup("用户分组"),
     ;
 
     @Getter

+ 120 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/org/UserGroupController.java

@@ -0,0 +1,120 @@
+package com.zhongshu.card.server.core.controller.org;
+
+import com.github.microservice.auth.security.annotations.ResourceAuth;
+import com.github.microservice.auth.security.type.AuthType;
+import com.github.microservice.net.ResultContent;
+import com.zhongshu.card.client.model.base.IDParam;
+import com.zhongshu.card.client.model.org.userGroup.*;
+import com.zhongshu.card.client.type.DataState;
+import com.zhongshu.card.server.core.service.org.UserGroupService;
+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.util.Assert;
+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("/userGroup")
+@Tag(name = "用户管理-用户分组")
+public class UserGroupController {
+
+    @Autowired
+    private UserGroupService userGroupService;
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "数据详情", description = "数据详情")
+    @RequestMapping(value = "getDetailInfo", method = {RequestMethod.POST})
+    public ResultContent<UserGroupModel> getDetailInfo(@RequestBody IDParam param) {
+        return this.userGroupService.getDetailInfo(param.getId());
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "添加-编辑数据", description = "添加-编辑数据")
+    @RequestMapping(value = "saveInfo", method = {RequestMethod.POST})
+    public ResultContent saveInfo(@RequestBody UserGroupParam param) {
+        return this.userGroupService.saveInfo(param);
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "删除数据", description = "删除数据")
+    @RequestMapping(value = "deleteInfo", method = {RequestMethod.POST})
+    public ResultContent deleteInfo(@RequestBody IDParam param) {
+        return this.userGroupService.deleteInfo(param.getId());
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "数据列表-分页查询", description = "数据列表-分页查询")
+    @RequestMapping(value = {"page"}, method = {RequestMethod.POST})
+    public ResultContent<Page<UserGroupModel>> page(
+            @Parameter(hidden = true) @PageableDefault(page = 0, size = 10) Pageable pageable,
+            @Parameter(required = false) UserGroupSearch param) {
+        Assert.hasText(param.getProjectOid(), "projectOid不能为空");
+        return userGroupService.page(param, pageable);
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "数据列表-分页查询(供选择使用)", description = "数据列表-分页查询")
+    @RequestMapping(value = {"pageForSelect"}, method = {RequestMethod.POST})
+    public ResultContent<Page<UserGroupModel>> pageForSelect(
+            @Parameter(hidden = true) @PageableDefault(page = 0, size = 10) Pageable pageable,
+            @Parameter(required = false) UserGroupSearch param) {
+        Assert.hasText(param.getProjectOid(), "projectOid不能为空");
+        return userGroupService.page(param, pageable);
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "启用数据", description = "启用数据")
+    @RequestMapping(value = "enableData", method = {RequestMethod.POST})
+    public ResultContent enableData(@RequestBody IDParam param) {
+        return this.userGroupService.changeState(param.getId(), DataState.Enable);
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "禁用数据", description = "禁用数据")
+    @RequestMapping(value = "disableData", method = {RequestMethod.POST})
+    public ResultContent disableData(@RequestBody IDParam param) {
+        return this.userGroupService.changeState(param.getId(), DataState.Disable);
+    }
+
+    //-----------------------------分组关联的用户信息 start--------------------
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "用户分组绑定用户", description = "用户分组绑定用户")
+    @RequestMapping(value = "groupBindUser", method = {RequestMethod.POST})
+    public ResultContent groupBindUser(@RequestBody UserGroupToUserAddParam param) {
+        return this.userGroupService.groupBindUser(param);
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "删除分组下的用户", description = "删除分组下的用户")
+    @RequestMapping(value = "deleteGroupUserInfo", method = {RequestMethod.POST})
+    public ResultContent deleteGroupUserInfo(@RequestBody IDParam param) {
+        return this.userGroupService.deleteGroupUserInfo(param.getId());
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "分组用户数据列表-分页查询", description = "分组用户数据列表-分页查询")
+    @RequestMapping(value = {"pageGroupUsers"}, method = {RequestMethod.POST})
+    public ResultContent<Page<UserGroupToUserModel>> pageGroupUsers(
+            @Parameter(hidden = true) @PageableDefault(page = 0, size = 10) Pageable pageable,
+            @Parameter(required = false) UserGroupToUserSearch param) {
+        Assert.hasText(param.getProjectOid(), "projectOid不能为空");
+        return userGroupService.pageGroupUsers(param, pageable);
+    }
+
+    //-----------------------------分组关联的用户信息 end----------------------
+
+}

+ 19 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/UserGroupDao.java

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

+ 23 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/UserGroupToUserDao.java

@@ -0,0 +1,23 @@
+package com.zhongshu.card.server.core.dao.org;
+
+import com.github.microservice.components.data.mongo.mongo.dao.MongoDao;
+import com.zhongshu.card.server.core.dao.org.extend.UserGroupToUserDaoExtend;
+import com.zhongshu.card.server.core.domain.org.OrganizationUser;
+import com.zhongshu.card.server.core.domain.org.UserGroup;
+import com.zhongshu.card.server.core.domain.org.UserGroupToUser;
+
+import java.util.List;
+
+/**
+ * @author TRX
+ * @date 2024/3/21
+ */
+public interface UserGroupToUserDao extends MongoDao<UserGroupToUser>, UserGroupToUserDaoExtend {
+
+    List<UserGroupToUser> findByIdIn(List<String> ids);
+
+    UserGroupToUser findTopById(String id);
+
+    UserGroupToUser findTopByUserGroupAndOrganizationUser(UserGroup userGroup, OrganizationUser organizationUser);
+
+}

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

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

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

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

+ 72 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/impl/UserGroupDaoImpl.java

@@ -0,0 +1,72 @@
+package com.zhongshu.card.server.core.dao.org.impl;
+
+import com.github.microservice.components.data.mongo.mongo.helper.DBHelper;
+import com.zhongshu.card.client.model.org.userGroup.UserGroupSearch;
+import com.zhongshu.card.server.core.dao.BaseImpl;
+import com.zhongshu.card.server.core.dao.org.DepartmentDao;
+import com.zhongshu.card.server.core.dao.org.RoleDao;
+import com.zhongshu.card.server.core.dao.org.extend.UserGroupDaoExtend;
+import com.zhongshu.card.server.core.domain.org.UserGroup;
+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 java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Pattern;
+
+/**
+ * @Author TRX
+ * @CreateDate: 2023/4/12
+ * @Version: 1.0
+ */
+public class UserGroupDaoImpl extends BaseImpl implements UserGroupDaoExtend {
+
+    @Autowired
+    private MongoTemplate mongoTemplate;
+
+    @Autowired
+    private DBHelper dbHelper;
+
+    @Autowired
+    private RoleDao roleDao;
+
+    @Autowired
+    private DepartmentDao departmentDao;
+
+    @Override
+    public Page<UserGroup> page(Pageable pageable, UserGroupSearch param) {
+        Criteria criteria = buildFilterCriteria(param);
+
+        Sort sort = buildSort(param);
+        Query query = Query.query(criteria);
+        query.with(sort);
+        return dbHelper.pages(query, pageable, UserGroup.class);
+    }
+
+    private Criteria buildFilterCriteria(UserGroupSearch param) {
+        Criteria criteria = buildCriteriaNotOid(param);
+
+        if (StringUtils.isNotEmpty(param.getProjectOid())) {
+            criteria.and("projectOid").is(param.getProjectOid());
+        }
+        if (param.getState() != null) {
+            criteria.and("state").is(param.getState());
+        }
+
+        // 模糊搜索
+        List<Criteria> criterias = new ArrayList<>();
+        // 用户名称
+        if (StringUtils.isNotEmpty(param.getName())) {
+            Pattern pattern = Pattern.compile("^.*" + param.getName() + ".*$");
+            criterias.add(Criteria.where("name").is(pattern));
+        }
+        return criteria;
+    }
+
+}

+ 65 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/impl/UserGroupToUserDaoImpl.java

@@ -0,0 +1,65 @@
+package com.zhongshu.card.server.core.dao.org.impl;
+
+import com.github.microservice.components.data.mongo.mongo.helper.DBHelper;
+import com.zhongshu.card.client.model.org.userGroup.UserGroupToUserSearch;
+import com.zhongshu.card.server.core.dao.BaseImpl;
+import com.zhongshu.card.server.core.dao.org.extend.UserGroupToUserDaoExtend;
+import com.zhongshu.card.server.core.domain.org.UserGroup;
+import com.zhongshu.card.server.core.domain.org.UserGroupToUser;
+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.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Pattern;
+
+/**
+ * @Author TRX
+ * @CreateDate: 2023/4/12
+ * @Version: 1.0
+ */
+public class UserGroupToUserDaoImpl extends BaseImpl implements UserGroupToUserDaoExtend {
+
+    @Autowired
+    private DBHelper dbHelper;
+
+    @Override
+    public Page<UserGroupToUser> page(Pageable pageable, UserGroupToUserSearch param) {
+        Criteria criteria = buildFilterCriteria(param);
+
+        Sort sort = buildSort(param);
+        Query query = Query.query(criteria);
+        query.with(sort);
+        return dbHelper.pages(query, pageable, UserGroupToUser.class);
+    }
+
+    private Criteria buildFilterCriteria(UserGroupToUserSearch param) {
+        Criteria criteria = buildCriteriaNotOid(param);
+
+        if (StringUtils.isNotEmpty(param.getProjectOid())) {
+            criteria.and("projectOid").is(param.getProjectOid());
+        }
+        if (param.getState() != null) {
+            criteria.and("state").is(param.getState());
+        }
+
+        if (StringUtils.isNotEmpty(param.getGroupId())) {
+            criteria.and("userGroup").is(UserGroup.build(param.getGroupId()));
+        }
+
+        // 模糊搜索
+        List<Criteria> criterias = new ArrayList<>();
+        // 用户名称
+        if (StringUtils.isNotEmpty(param.getName())) {
+            Pattern pattern = Pattern.compile("^.*" + param.getName() + ".*$");
+            criterias.add(Criteria.where("name").is(pattern));
+        }
+        return criteria;
+    }
+
+}

+ 40 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/devices/DeviceGroup.java

@@ -0,0 +1,40 @@
+package com.zhongshu.card.server.core.domain.devices;
+
+import com.zhongshu.card.client.type.DataState;
+import com.zhongshu.card.server.core.domain.base.SuperMain;
+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/12/19
+ */
+@Data
+@Document
+@AllArgsConstructor
+@NoArgsConstructor
+@NonLeaked
+public class DeviceGroup extends SuperMain {
+
+    @Schema(description = "分组名称")
+    private String name;
+
+    @Schema(description = "数据状态")
+    private DataState state = DataState.Enable;
+
+    @Schema(description = "关联的用户数量")
+    private Long number = 0L;
+
+    public static DeviceGroup build(String id) {
+        DeviceGroup entity = new DeviceGroup();
+        entity.setId(id);
+        return entity;
+    }
+
+}

+ 35 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/devices/DeviceGroupToDevice.java

@@ -0,0 +1,35 @@
+package com.zhongshu.card.server.core.domain.devices;
+
+import com.zhongshu.card.server.core.domain.base.SuperMain;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.data.mongodb.core.mapping.DBRef;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+/**
+ * @author TRX
+ * @date 2024/12/19
+ */
+@Data
+@Document
+@AllArgsConstructor
+@NoArgsConstructor
+public class DeviceGroupToDevice extends SuperMain {
+
+    @Schema(description = "所属分组")
+    @DBRef(lazy = true)
+    private DeviceGroup deviceGroup;
+
+    @Schema(description = "设备数据")
+    @DBRef(lazy = true)
+    private DeviceInfo deviceInfo;
+
+    @Schema(description = "设备ID、设备号")
+    private String deviceId;
+
+    @Schema(description = "设备名称")
+    private String deviceName;
+
+}

+ 36 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/org/UserGroup.java

@@ -0,0 +1,36 @@
+package com.zhongshu.card.server.core.domain.org;
+
+import com.zhongshu.card.client.type.DataState;
+import com.zhongshu.card.server.core.domain.base.SuperMain;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+/**
+ * 用户分组信息
+ *
+ * @author TRX
+ * @date 2024/12/19
+ */
+@Data
+@Document
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserGroup extends SuperMain {
+
+    @Schema(description = "分组名称")
+    private String name;
+
+    private DataState state = DataState.Enable;
+
+    @Schema(description = "关联的用户数量")
+    private Long number = 0L;
+
+    public static UserGroup build(String id) {
+        UserGroup entity = new UserGroup();
+        entity.setId(id);
+        return entity;
+    }
+}

+ 38 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/org/UserGroupToUser.java

@@ -0,0 +1,38 @@
+package com.zhongshu.card.server.core.domain.org;
+
+import com.zhongshu.card.server.core.domain.base.SuperMain;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.data.mongodb.core.mapping.DBRef;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+/**
+ * @author TRX
+ * @date 2024/12/19
+ */
+@Data
+@Document
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserGroupToUser extends SuperMain {
+
+    @Schema(description = "所属分组")
+    @DBRef(lazy = true)
+    private UserGroup userGroup;
+
+    @Schema(description = "机构用户信息")
+    @DBRef(lazy = true)
+    private OrganizationUser organizationUser;
+
+    @Schema(description = "机构用户数据id")
+    private String orgDataId;
+
+    @Schema(description = "用户userId")
+    private String userId;
+
+    @Schema(description = "用户名称")
+    private String userName;
+
+}

+ 186 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/org/UserGroupService.java

@@ -0,0 +1,186 @@
+package com.zhongshu.card.server.core.service.org;
+
+import com.github.microservice.components.data.base.util.PageEntityUtil;
+import com.github.microservice.net.ResultContent;
+import com.github.microservice.net.ResultMessage;
+import com.zhongshu.card.client.model.org.userGroup.*;
+import com.zhongshu.card.client.type.DataState;
+import com.zhongshu.card.server.core.dao.org.OrganizationDao;
+import com.zhongshu.card.server.core.dao.org.OrganizationUserDao;
+import com.zhongshu.card.server.core.dao.org.UserGroupDao;
+import com.zhongshu.card.server.core.dao.org.UserGroupToUserDao;
+import com.zhongshu.card.server.core.domain.org.*;
+import com.zhongshu.card.server.core.service.base.SuperService;
+import com.zhongshu.card.server.core.service.user.UserAccountServiceImpl;
+import com.zhongshu.card.server.core.util.BeanUtils;
+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.ArrayList;
+import java.util.List;
+
+/**
+ * 权限时间段管理
+ *
+ * @author TRX
+ * @date 2024/12/19
+ */
+@Slf4j
+@Service
+public class UserGroupService extends SuperService {
+
+    @Autowired
+    private UserGroupDao userGroupDao;
+
+    @Autowired
+    private UserGroupToUserDao userGroupToUserDao;
+
+    @Autowired
+    private OrganizationDao organizationDao;
+
+    @Autowired
+    private UserAccountServiceImpl userAccountService;
+
+    @Autowired
+    private OrganizationUserDao organizationUserDao;
+
+    public ResultContent saveInfo(UserGroupParam param) {
+        Assert.hasText(param.getProjectOid(), "projectOid不能为空");
+
+        UserGroup entity = null;
+        if (StringUtils.isNotEmpty(param.getId())) {
+            entity = userGroupDao.findTopById(param.getId());
+            if (ObjectUtils.isEmpty(entity)) {
+                return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, param.getId()));
+            }
+            initUpdateEntity(entity);
+        } else {
+            entity = new UserGroup();
+            initEntityNoCheckOid(entity);
+        }
+        BeanUtils.copyProperties(param, entity);
+        userGroupDao.save(entity);
+        return ResultContent.buildSuccess();
+    }
+
+    public ResultContent<Page<UserGroupModel>> page(UserGroupSearch param, Pageable pageable) {
+        String projectOid = param.getProjectOid();
+        Organization organization = organizationDao.findTopByOid(projectOid);
+        if (ObjectUtils.isEmpty(organization)) {
+            return ResultContent.buildFail("projectOid不存在");
+        }
+        Page<UserGroup> page = userGroupDao.page(pageable, param);
+        return ResultContent.buildSuccess(PageEntityUtil.concurrent2PageModel(page, this::toModel));
+    }
+
+    public ResultContent deleteInfo(String id) {
+        UserGroup entity = userGroupDao.findTopById(id);
+        if (ObjectUtils.isEmpty(entity)) {
+            return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, id));
+        }
+        userGroupDao.delete(entity);
+        return ResultContent.buildSuccess();
+    }
+
+    public ResultContent<UserGroupModel> getDetailInfo(String id) {
+        UserGroup entity = userGroupDao.findTopById(id);
+        if (ObjectUtils.isEmpty(entity)) {
+            return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, id));
+        }
+        return ResultContent.buildSuccess(toModel(entity));
+    }
+
+    public ResultContent changeState(String id, DataState state) {
+        UserGroup entity = userGroupDao.findTopById(id);
+        if (ObjectUtils.isEmpty(entity)) {
+            return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, id));
+        }
+        entity.setState(state);
+        userGroupDao.save(entity);
+        return ResultContent.buildSuccess();
+    }
+
+    //-----------------------------分组关联的用户信息 start--------------------
+
+    public ResultContent groupBindUser(UserGroupToUserAddParam param) {
+        UserGroup userGroup = userGroupDao.findTopById(param.getGroupId());
+        if (ObjectUtils.isEmpty(userGroup)) {
+            return ResultContent.buildFail("分组不存在");
+        }
+        if (ObjectUtils.isEmpty(param.getOrgUserId())) {
+            return ResultContent.buildFail("用户信息为空");
+        }
+        List<OrganizationUser> list = organizationUserDao.findByIdIn(param.getOrgUserId());
+        if (ObjectUtils.isNotEmpty(list)) {
+            List<UserGroupToUser> saveList = new ArrayList<>();
+            for (OrganizationUser organizationUser : list) {
+                UserGroupToUser userGroupToUser = userGroupToUserDao.findTopByUserGroupAndOrganizationUser(userGroup, organizationUser);
+                if (ObjectUtils.isEmpty(userGroupToUser)) {
+                    userGroupToUser = new UserGroupToUser();
+                    userGroupToUser.setUserGroup(userGroup);
+                    userGroupToUser.setOrganizationUser(organizationUser);
+
+                    userGroupToUser.setProjectOid(userGroup.getProjectOid());
+                    userGroupToUser.setOrgDataId(organizationUser.getId());
+                    UserAccount userAccount = organizationUser.getUser();
+                    userGroupToUser.setUserName(userAccount.getName());
+                    userGroupToUser.setUserId(userAccount.getUserId());
+
+                    initEntity(userGroupToUser);
+                    saveList.add(userGroupToUser);
+                }
+            }
+            if (ObjectUtils.isNotEmpty(saveList)) {
+                userGroupToUserDao.saveAll(saveList);
+            }
+        }
+        return ResultContent.buildSuccess();
+    }
+
+    public ResultContent deleteGroupUserInfo(String id) {
+        UserGroupToUser entity = userGroupToUserDao.findTopById(id);
+        if (ObjectUtils.isEmpty(entity)) {
+            return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, id));
+        }
+        userGroupToUserDao.delete(entity);
+        return ResultContent.buildSuccess();
+    }
+
+    public ResultContent<Page<UserGroupToUserModel>> pageGroupUsers(UserGroupToUserSearch param, Pageable pageable) {
+        String projectOid = param.getProjectOid();
+        Organization organization = organizationDao.findTopByOid(projectOid);
+        if (ObjectUtils.isEmpty(organization)) {
+            return ResultContent.buildFail("projectOid不存在");
+        }
+        Page<UserGroupToUser> page = userGroupToUserDao.page(pageable, param);
+        return ResultContent.buildSuccess(PageEntityUtil.concurrent2PageModel(page, this::toUserModel));
+    }
+
+    //-----------------------------分组关联的用户信息 end----------------------
+
+    private UserGroupModel toModel(UserGroup entity) {
+        UserGroupModel model = new UserGroupModel();
+        if (ObjectUtils.isNotEmpty(entity)) {
+            BeanUtils.copyProperties(entity, model);
+        }
+        return model;
+    }
+
+    public UserGroupToUserModel toUserModel(UserGroupToUser entity) {
+        UserGroupToUserModel model = null;
+        if (ObjectUtils.isNotEmpty(entity)) {
+            model = new UserGroupToUserModel();
+            model.setId(entity.getId());
+
+            model.setUser(userAccountService.toOrgUserModel(entity.getOrganizationUser()));
+        }
+        return model;
+    }
+
+}