TRX 1 an în urmă
părinte
comite
2f8cc00d90
39 a modificat fișierele cu 852 adăugiri și 77 ștergeri
  1. 116 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/devices/DevicePermissModel.java
  2. 29 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/devices/DevicePermissParam.java
  3. 65 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/devices/DevicePermissSearch.java
  4. 43 1
      FullCardClient/src/main/java/com/zhongshu/card/client/model/org/OrganizationUserModel.java
  5. 5 2
      FullCardClient/src/main/java/com/zhongshu/card/client/model/org/OrganizationUserSearch.java
  6. 35 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/ProjectAgreementConfigParam.java
  7. 0 3
      FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/ProjectExcelTemplateParam.java
  8. 1 1
      FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/ProjectExcelTemplateQuery.java
  9. 4 3
      FullCardClient/src/main/java/com/zhongshu/card/client/model/school/ExcelUserParam.java
  10. 95 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/devices/DevicePermissController.java
  11. 20 8
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/org/OrganizationUserController.java
  12. 10 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/org/TestController.java
  13. 15 7
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/projectAbout/ProjectCommonConfigController.java
  14. 0 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/setting/PlatFormConfigInfoController.java
  15. 2 2
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/DeviceBindDao.java
  16. 2 2
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/DeviceInfoDao.java
  17. 19 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/DevicePermissDao.java
  18. 2 2
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/GateWayInfoDao.java
  19. 1 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/extend/DeviceBindDaoExtend.java
  20. 1 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/extend/DeviceInfoDaoExtend.java
  21. 19 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/extend/DevicePermissDaoExtend.java
  22. 1 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/extend/GateWayInfoDaoExtend.java
  23. 2 2
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/impl/DeviceBindDaoImpl.java
  24. 2 2
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/impl/DeviceInfoDaoImpl.java
  25. 139 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/impl/DevicePermissDaoImpl.java
  26. 2 2
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/impl/GateWayInfoDaoImpl.java
  27. 15 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/impl/OrganizationUserDaoImpl.java
  28. 59 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/devices/DevicePermiss.java
  29. 1 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/devices/DeviceInfoServiceImpl.java
  30. 67 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/devices/DevicePermissService.java
  31. 1 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/devices/GateWayInfoServiceImpl.java
  32. 1 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/hxz/HxzService.java
  33. 19 7
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/org/OrganizationUserServiceImpl.java
  34. 2 2
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/payment/ExpenseFlowServiceImpl.java
  35. 42 4
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/projectAbout/ProjectCommonConfigService.java
  36. 2 17
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/projectAbout/ProjectExcelTemplateService.java
  37. 2 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/school/CardInfoServiceImpl.java
  38. 2 2
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/school/DeviceBindServiceImpl.java
  39. 9 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/user/UserAccountServiceImpl.java

+ 116 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/devices/DevicePermissModel.java

@@ -0,0 +1,116 @@
+package com.zhongshu.card.client.model.devices;
+
+import com.github.microservice.models.type.DeviceType;
+import com.zhongshu.card.client.model.base.SuperModel;
+import com.zhongshu.card.client.model.org.DepartmentModel;
+import com.zhongshu.card.client.model.org.OrganizationUserModel;
+import com.zhongshu.card.client.model.org.UserCountModel;
+import com.zhongshu.card.client.model.org.role.RoleModel;
+import com.zhongshu.card.client.model.school.AreaModel;
+import com.zhongshu.card.client.model.school.DictInfoSimpleModel;
+import com.zhongshu.card.client.type.UserState;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.ObjectUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author TRX
+ * @date 2024/10/11
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class DevicePermissModel extends SuperModel {
+
+    @Schema(description = "关联的设备信息")
+    private DeviceInfoModel deviceInfo;
+
+    //------------------设备冗余数据 start-------------------
+    @Schema(description = "设备ID")
+    private String deviceId;
+
+    @Schema(description = "设备名称")
+    private String deviceName;
+
+    @Schema(description = "设备类型,如 消费机 门禁机")
+    private DeviceType deviceType;
+
+    private String deviceTypeStr;
+
+    public String getDeviceTypeStr() {
+        if (deviceType != null) {
+            return deviceType.getRemark();
+        }
+        return "";
+    }
+
+    @Schema(description = "区域信息")
+    private AreaModel area;
+
+    public AreaModel getArea() {
+        if (ObjectUtils.isNotEmpty(deviceInfo)) {
+            return deviceInfo.getArea();
+        }
+        return null;
+    }
+
+    @Schema(description = "区域所有上级ID路径,如:a1/a12/a123")
+    private String areaPaths = "";
+
+    @Schema(description = "可使用的用户信息")
+    private UserCountModel userAccount;
+
+    public UserCountModel getUserAccount() {
+        if (organizationUser != null) {
+            return organizationUser.getUser();
+        }
+        return null;
+    }
+
+    @Schema(description = "机构用户信息")
+    private OrganizationUserModel organizationUser;
+
+    //---------------用户冗余数据 start--------------
+
+    @Schema(description = "可使用用户userId")
+    private String userId;
+
+    @Schema(description = "昵称")
+    private String name;
+
+    @Schema(description = "编码")
+    private String code;
+
+    @Schema(description = "用户所属机构oid")
+    private String userOid;
+
+    @Schema(description = "职位")
+    private DictInfoSimpleModel position;
+
+    @Schema(description = "角色信息")
+    private List<RoleModel> roles = new ArrayList<>();
+
+    @Schema(description = "部门信息")
+    private DepartmentModel department;
+
+    @Schema(description = "用户状态")
+    private UserState state = UserState.Normal;
+
+    private String stateStr;
+
+    public String getStateStr() {
+        if (state != null) {
+            return state.getRemark();
+        }
+        return "";
+    }
+
+    @Schema(description = "权限是否下发")
+    private Boolean isUsed = Boolean.FALSE;
+
+}

+ 29 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/devices/DevicePermissParam.java

@@ -0,0 +1,29 @@
+package com.zhongshu.card.client.model.devices;
+
+import com.zhongshu.card.client.model.base.SuperParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+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/10/11
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class DevicePermissParam extends SuperParam {
+
+    @Schema(description = "设备ID")
+    @NotEmpty
+    private String deviceId;
+
+    @Schema(description = "机构用户id集合")
+    private List<String> ids = new ArrayList<>();
+
+}

+ 65 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/devices/DevicePermissSearch.java

@@ -0,0 +1,65 @@
+package com.zhongshu.card.client.model.devices;
+
+import com.github.microservice.auth.security.type.AuthType;
+import com.github.microservice.models.type.DeviceType;
+import com.zhongshu.card.client.model.base.SuperSearch;
+import com.zhongshu.card.client.type.UserState;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @author TRX
+ * @date 2024/10/11
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class DevicePermissSearch extends SuperSearch {
+
+    //------------------设备冗余数据 start-------------------
+
+    @Schema(description = "")
+    private String deviceKeyWord;
+
+    @Schema(description = "设备类型,如 消费机 门禁机")
+    private DeviceType deviceType;
+
+    @Schema(description = "区域信息")
+    private String areaId;
+
+    @Schema(description = "区域所有上级ID路径,如:a1/a12/a123")
+    private String areaPaths = "";
+
+    //---------------用户冗余数据 start--------------
+
+    @Schema(description = "用户所属机构的类型")
+    private AuthType authType;
+
+    @Schema(description = "用户搜索")
+    private String userKeyWord;
+
+    @Schema(description = "可使用用户userId")
+    private String userId;
+
+    @Schema(description = "用户所属机构oid")
+    private String userOid;
+
+    @Schema(description = "职位")
+    private String positionId;
+
+    @Schema(description = "角色信息")
+    private List<String> roleIds;
+
+    @Schema(description = "部门信息")
+    private List<String> departmentIds;
+
+    @Schema(description = "用户状态")
+    private UserState state = UserState.Normal;
+
+    @Schema(description = "权限是否下发")
+    private Boolean isUsed = Boolean.FALSE;
+}

+ 43 - 1
FullCardClient/src/main/java/com/zhongshu/card/client/model/org/OrganizationUserModel.java

@@ -16,6 +16,7 @@ import org.apache.commons.lang3.ObjectUtils;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 机构用户详情
@@ -29,7 +30,16 @@ import java.util.List;
 public class OrganizationUserModel extends SuperModel {
 
     @Schema(description = "机构信息")
-    private OrganizationModel organization;
+    private OrganizationMiniModel organization;
+
+    private String organizationName;
+
+    public String getOrganizationName() {
+        if (organization != null) {
+            return organization.getName();
+        }
+        return "";
+    }
 
     @Schema(description = "用户信息")
     private UserCountModel user;
@@ -100,6 +110,7 @@ public class OrganizationUserModel extends SuperModel {
     @Schema(description = "用户状态")
     private UserState state = UserState.Normal;
 
+    @Schema(description = "状态名称")
     private String stateStr;
 
     public String getStateStr() {
@@ -145,15 +156,46 @@ public class OrganizationUserModel extends SuperModel {
     @Schema(description = "职位")
     private DictInfoSimpleModel position;
 
+    @Schema(description = "职位名称")
+    private String positionName;
+
+    public String getPositionName() {
+        if (position != null) {
+            return position.getName();
+        }
+        return "";
+    }
+
     @Schema(description = "人脸照片")
     private List<String> faceImages;
 
     @Schema(description = "角色信息")
     private List<RoleModel> roles = new ArrayList<>();
 
+    @Schema(description = "角色-人员类型名称")
+    private String roleNames;
+
+    public String getRoleNames() {
+        if (ObjectUtils.isNotEmpty(roles)) {
+            List<String> strs = roles.stream().map(it -> it.getName()).collect(Collectors.toList());
+            return String.join("、", strs);
+        }
+        return "";
+    }
+
     @Schema(description = "部门信息")
     private DepartmentModel department;
 
+    @Schema(description = "部门名称")
+    private String departmentName;
+
+    public String getDepartmentName() {
+        if (department != null) {
+            return department.getName();
+        }
+        return "";
+    }
+
     @Schema(description = "部门信息所有级")
     private List<DepartmentModel> departments = new ArrayList<>();
 }

+ 5 - 2
FullCardClient/src/main/java/com/zhongshu/card/client/model/org/OrganizationUserSearch.java

@@ -46,13 +46,16 @@ public class OrganizationUserSearch extends SuperSearch {
     @Schema(description = "职位ID")
     private String positionId;
 
-    @Schema(description = "部门ID合")
+    @Schema(description = "部门ID合")
     private List<String> departmentIds;
 
-    @Schema(description = "角色ID集合")
+    @Schema(description = "人员类型-角色ID集合")
     private List<String> roleIds;
 
     @Schema(description = "是否是搜索项目的用户")
     private Boolean isSearchProject = Boolean.FALSE;
 
+    @Schema(description = "机构类型")
+    private AuthType notAuthType;
+
 }

+ 35 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/ProjectAgreementConfigParam.java

@@ -0,0 +1,35 @@
+package com.zhongshu.card.client.model.projectAbout;
+
+import com.zhongshu.card.client.type.PassWordDefaultType;
+import com.zhongshu.card.client.type.PassWordType;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author TRX
+ * @date 2024/9/24
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ProjectAgreementConfigParam {
+
+    @NotEmpty
+    @Schema(description = "项目id")
+    private String projectOid;
+
+    @Schema(description = "用户协议")
+    @NotEmpty
+    private String userAgreement = "";
+
+    @NotEmpty
+    @Schema(description = "隐私政策")
+    private String privacyPolicy = "";
+
+}

+ 0 - 3
FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/ProjectExcelTemplateParam.java

@@ -20,9 +20,6 @@ import lombok.NoArgsConstructor;
 @NoArgsConstructor
 public class ProjectExcelTemplateParam {
 
-    @Schema(description = "数据ID")
-    private String id;
-
     @Schema(description = "项目id", hidden = true)
     private String projectOid;
 

+ 1 - 1
FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/ProjectExcelTemplateQuery.java

@@ -16,7 +16,7 @@ import lombok.NoArgsConstructor;
 @AllArgsConstructor
 @NoArgsConstructor
 @Builder
-public class ProjectExcelTemplateQuery extends ProjectOidParam {
+public class ProjectExcelTemplateQuery {
 
     @NotEmpty
     @Schema(description = "类型", required = true)

+ 4 - 3
FullCardClient/src/main/java/com/zhongshu/card/client/model/school/ExcelUserParam.java

@@ -16,19 +16,20 @@ import lombok.NoArgsConstructor;
 @AllArgsConstructor
 @NoArgsConstructor
 public class ExcelUserParam {
+
     @Excel(name = "姓名")
     private String name;
 
     @Excel(name = "性别")
     private String sexStr;
 
-    @Excel(name = "人员编")
+    @Excel(name = "人员编")
     private String code;
 
-    @Excel(name = "证")
+    @Excel(name = "身份证号")
     private String cardNumber;
 
-    @Excel(name = "用户手机号")
+    @Excel(name = "手机号")
     private String phone;
 
     @Excel(name = "备注")

+ 95 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/devices/DevicePermissController.java

@@ -0,0 +1,95 @@
+package com.zhongshu.card.server.core.controller.devices;
+
+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.devices.*;
+import com.zhongshu.card.client.service.school.DeviceInfoService;
+import com.zhongshu.card.server.core.service.devices.DevicePermissService;
+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.*;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * 用户设备权限
+ *
+ * @author TRX
+ * @date 2024/6/5
+ */
+@RestController
+@RequestMapping("/devicePermiss")
+@Tag(name = "项目-用户设备权限")
+public class DevicePermissController {
+
+    @Autowired
+    private DeviceInfoService deviceInfoService;
+
+    @Autowired
+    private DevicePermissService devicePermissService;
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "设备绑定用户", description = "设备绑定用户")
+    @RequestMapping(value = "saveBindInfo", method = {RequestMethod.POST})
+    public ResultContent saveBindInfo(@RequestBody @Valid DevicePermissParam param) {
+        return this.devicePermissService.saveBindInfo(param);
+    }
+
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "根据设备ID 设备详情(精确匹配)", description = "根据设备ID 设备详情(精确匹配)")
+    @RequestMapping(value = "getDeviceByDeviceId", method = {RequestMethod.GET})
+    public ResultContent<DeviceInfoMoreModel> getDeviceByDeviceId(@RequestParam(name = "deviceId") String deviceId) {
+        return this.deviceInfoService.getDeviceDetailByDeviceId(deviceId);
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "根据设备ID 设备列表(模糊匹配)", description = "根据设备ID 设备列表(模糊匹配)")
+    @RequestMapping(value = "getDeviceDetailByDeviceIdLike", method = {RequestMethod.GET})
+    public ResultContent<List<DeviceInfoMoreModel>> getDeviceDetailByDeviceIdLike(@RequestParam(name = "deviceId") String deviceId) {
+        return this.deviceInfoService.getDeviceDetailByDeviceIdLike(deviceId);
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "添加-编辑设备", description = "添加-编辑设备")
+    @RequestMapping(value = "addDeviceInfo", method = {RequestMethod.POST})
+    public ResultContent addDeviceInfo(@RequestBody DeviceInfoParam param) {
+        return this.deviceInfoService.addDeviceInfo(param);
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "删除设备", description = "删除设备")
+    @RequestMapping(value = "deleteDeviceInfo", method = {RequestMethod.POST})
+    public ResultContent deleteDeviceInfo(@RequestBody IDParam param) {
+        return this.deviceInfoService.deleteDeviceInfo(param.getId());
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "设备列表-分页查询", description = "设备列表-分页查询")
+    @RequestMapping(value = {"page"}, method = {RequestMethod.POST})
+    public ResultContent<Page<DeviceInfoModel>> page(
+            @Parameter(hidden = true) @PageableDefault(page = 0, size = 10) Pageable pageable,
+            @Parameter(required = false) DeviceInfoSearch param) {
+        Assert.hasText(param.getProjectOid(), "projectOid不能为空");
+        return deviceInfoService.page(param, pageable);
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "修改设备信息", description = "修改设备信息")
+    @RequestMapping(value = "updateDevice", method = {RequestMethod.POST})
+    public ResultContent updateDevice(@RequestBody @Valid DeviceBindAreaParam param) {
+        return this.deviceInfoService.updateDevice(param);
+    }
+
+    //----------------------------设备基础信息 end--------------------------
+
+}

+ 20 - 8
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/org/OrganizationUserController.java

@@ -67,8 +67,7 @@ public class OrganizationUserController {
     @ResourceAuth(value = "user", type = AuthType.User)
     @Operation(summary = "项目用户列表-分页查询", description = "项目用户列表-分页查询")
     @RequestMapping(value = {"projectUserPage"}, method = {RequestMethod.POST})
-    public ResultContent<Page<OrganizationUserModel>> projectUserPage(
-            @Parameter(hidden = true) @PageableDefault(page = 0, size = 10) Pageable pageable,
+    public ResultContent<Page<OrganizationUserModel>> projectUserPage(@Parameter(hidden = true) @PageableDefault(page = 0, size = 10) Pageable pageable,
             @Parameter(required = false) OrganizationUserSearch param) {
         // 项目用户 包括项目下所有的机构的用户
         param.setIsSearchProject(Boolean.TRUE);
@@ -79,14 +78,22 @@ public class OrganizationUserController {
     @ResourceAuth(value = "user", type = AuthType.User)
     @Operation(summary = "机构用户列表-分页查询", description = "机构用户列表-分页查询")
     @RequestMapping(value = {"orgUserPage"}, method = {RequestMethod.POST})
-    public ResultContent<Page<OrganizationUserModel>> orgUserPage(
-            @Parameter(hidden = true) @PageableDefault(page = 0, size = 10) Pageable pageable,
-            @Parameter(required = false) OrganizationUserSearch param) {
+    public ResultContent<Page<OrganizationUserModel>> orgUserPage(@Parameter(hidden = true) @PageableDefault(page = 0, size = 10) Pageable pageable, @Parameter(required = false) OrganizationUserSearch param) {
         param.setIsSearchProject(Boolean.FALSE);
         Assert.hasText(param.getOid(), "oid不能为空");
         return userAccountService.pageOrgUser(param, pageable);
     }
 
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "项目机构用户列表-分页查询", description = "项目机构用户列表-分页查询")
+    @RequestMapping(value = {"projectOrgUserPage"}, method = {RequestMethod.POST})
+    public ResultContent<Page<OrganizationUserModel>> projectOrgUserPage(@Parameter(hidden = true) @PageableDefault(page = 0, size = 10) Pageable pageable, @Parameter(required = false) OrganizationUserSearch param) {
+        param.setIsSearchProject(Boolean.TRUE);
+        param.setNotAuthType(AuthType.Project);
+        Assert.hasText(param.getProjectOid(), "projectOid不能为空");
+        return userAccountService.pageOrgUser(param, pageable);
+    }
+
     @ResourceAuth(value = "user", type = AuthType.User)
     @Operation(summary = "机构用户详情", description = "平台用户详情")
     @RequestMapping(value = {"getOrgUserDetail"}, method = {RequestMethod.POST})
@@ -97,13 +104,18 @@ public class OrganizationUserController {
     @ResourceAuth(value = "user", type = AuthType.User)
     @RequestMapping(value = "importProjectUsers", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, method = RequestMethod.POST)
     @Operation(summary = "导入项目用户", description = "导入项目用户")
-    public ResultContent<ImportResultModel> importProjectUsers(HttpServletRequest request,
-            HttpServletResponse response,
-            @RequestPart("file") MultipartFile file, ProjectOidParam param) throws IOException {
+    public ResultContent<ImportResultModel> importProjectUsers(HttpServletRequest request, HttpServletResponse response, @RequestPart("file") MultipartFile file, ProjectOidParam param) throws IOException {
         if (file == null || file.isEmpty()) {
             return ResultContent.buildFail("文件不能为空");
         }
         return organizationUserService.importSchoolUsers(request, response, file, param);
     }
 
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @RequestMapping(value = "exportProjectUser", method = RequestMethod.POST)
+    @Operation(summary = "导出项目用户", description = "导出项目用户")
+    public void exportProjectUser(HttpServletRequest request, HttpServletResponse response, OrganizationUserSearch param) throws IOException {
+        organizationUserService.exportProjectUser(request, response, param);
+    }
+
 }

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

@@ -1,15 +1,19 @@
 package com.zhongshu.card.server.core.controller.org;
 
 import com.github.microservice.net.ResultContent;
+import com.zhongshu.card.server.core.dao.school.CardInfoDao;
+import com.zhongshu.card.server.core.domain.school.CardInfo;
 import com.zhongshu.card.server.core.service.TestService;
 import com.zhongshu.card.server.core.service.openAPI.OpenAPIRegisterService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
+@Slf4j
 @RestController
 @RequestMapping("test")
 @Tag(name = "测试")
@@ -21,9 +25,15 @@ public class TestController {
     @Autowired
     OpenAPIRegisterService openAPIRegisterService;
 
+    @Autowired
+    CardInfoDao cardInfoDao;
+
     @Operation(summary = "测试接口", description = "测试接口")
     @RequestMapping(value = "text", method = {RequestMethod.GET})
     public ResultContent text() {
+        CardInfo cardInfo = cardInfoDao.findByCode("EB0659EB");
+        log.info("cardInfo: {}", cardInfo);
+
         openAPIRegisterService.initRegisterPAIS();
         return this.testService.text();
     }

+ 15 - 7
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/projectAbout/ProjectCommonConfigController.java

@@ -4,6 +4,7 @@ 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.ProjectOidParam;
+import com.zhongshu.card.client.model.projectAbout.ProjectAgreementConfigParam;
 import com.zhongshu.card.client.model.projectAbout.ProjectCommonConfigModel;
 import com.zhongshu.card.client.model.projectAbout.ProjectCommonConfigParam;
 import com.zhongshu.card.server.core.service.projectAbout.ProjectCommonConfigService;
@@ -35,6 +36,7 @@ public class ProjectCommonConfigController {
     @ResourceAuth(value = "user", type = AuthType.User)
     @Operation(summary = "保存项目的通用设置", description = "保存项目的通用设置")
     @RequestMapping(value = "saveInfo", method = {RequestMethod.POST})
+    @Hidden
     public ResultContent saveInfo(@RequestBody @Valid ProjectCommonConfigParam param) {
         return projectCommonConfigService.saveInfo(param);
     }
@@ -42,17 +44,23 @@ public class ProjectCommonConfigController {
     @ResourceAuth(value = "user", type = AuthType.User)
     @Operation(summary = "得到项目的通用配置", description = "得到项目的通用配置")
     @RequestMapping(value = "getInfo", method = {RequestMethod.POST})
+    @Hidden
     public ResultContent<ProjectCommonConfigModel> getProjectWeChatInfo(@RequestBody ProjectOidParam param) {
         return projectCommonConfigService.getInfo(param.getProjectOid());
     }
 
-    //------------------------------feign start -----------------------
-    @Operation(hidden = true, summary = "得到项目的通用配置", description = "得到项目的通用配置")
-    @RequestMapping(value = "manager/getProjectIotInfo", method = {RequestMethod.POST})
-    @Hidden
-    public ResultContent<ProjectCommonConfigModel> getProjectIotInfo(
-            @RequestBody ProjectOidParam param) {
-        return projectCommonConfigService.getInfo(param.getProjectOid());
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "保存项目的协议配置", description = "保存项目的协议配置")
+    @RequestMapping(value = "saveAgreementInfo", method = {RequestMethod.POST})
+    public ResultContent saveAgreementInfo(@RequestBody @Valid ProjectAgreementConfigParam param) {
+        return projectCommonConfigService.saveAgreementInfo(param);
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "得到项目的协议配置", description = "得到项目的协议配置")
+    @RequestMapping(value = "getAgreementInfo", method = {RequestMethod.POST})
+    public ResultContent<ProjectAgreementConfigParam> getAgreementInfo(@RequestBody ProjectOidParam param) {
+        return projectCommonConfigService.getAgreementInfo(param.getProjectOid());
     }
 
 }

+ 0 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/setting/PlatFormConfigInfoController.java

@@ -39,7 +39,6 @@ public class PlatFormConfigInfoController {
         return ResultContent.buildSuccess();
     }
 
-    @ResourceAuth(value = "user", type = AuthType.User)
     @Operation(summary = "得到平台基本信息", description = "得到平台基本信息")
     @RequestMapping(value = "getBasicInfo", method = {RequestMethod.GET})
     public ResultContent getBasicInfo() {

+ 2 - 2
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/DeviceBindDao.java → FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/DeviceBindDao.java

@@ -1,7 +1,7 @@
-package com.zhongshu.card.server.core.dao.school;
+package com.zhongshu.card.server.core.dao.devices;
 
 import com.github.microservice.components.data.mongo.mongo.dao.MongoDao;
-import com.zhongshu.card.server.core.dao.school.extend.DeviceBindDaoExtend;
+import com.zhongshu.card.server.core.dao.devices.extend.DeviceBindDaoExtend;
 import com.zhongshu.card.server.core.domain.devices.DeviceBind;
 
 /**

+ 2 - 2
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/DeviceInfoDao.java → FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/DeviceInfoDao.java

@@ -1,7 +1,7 @@
-package com.zhongshu.card.server.core.dao.school;
+package com.zhongshu.card.server.core.dao.devices;
 
 import com.github.microservice.components.data.mongo.mongo.dao.MongoDao;
-import com.zhongshu.card.server.core.dao.school.extend.DeviceInfoDaoExtend;
+import com.zhongshu.card.server.core.dao.devices.extend.DeviceInfoDaoExtend;
 import com.zhongshu.card.server.core.domain.devices.DeviceInfo;
 
 import java.util.List;

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

@@ -0,0 +1,19 @@
+package com.zhongshu.card.server.core.dao.devices;
+
+import com.github.microservice.components.data.mongo.mongo.dao.MongoDao;
+import com.zhongshu.card.server.core.dao.devices.extend.DeviceBindDaoExtend;
+import com.zhongshu.card.server.core.dao.devices.extend.DevicePermissDaoExtend;
+import com.zhongshu.card.server.core.domain.devices.DeviceBind;
+import com.zhongshu.card.server.core.domain.devices.DevicePermiss;
+
+/**
+ * 设备Dao
+ *
+ * @author TRX
+ * @date 2024/3/21
+ */
+public interface DevicePermissDao extends MongoDao<DevicePermiss>, DevicePermissDaoExtend {
+
+    DevicePermiss findTopById(String id);
+
+}

+ 2 - 2
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/GateWayInfoDao.java → FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/GateWayInfoDao.java

@@ -1,7 +1,7 @@
-package com.zhongshu.card.server.core.dao.school;
+package com.zhongshu.card.server.core.dao.devices;
 
 import com.github.microservice.components.data.mongo.mongo.dao.MongoDao;
-import com.zhongshu.card.server.core.dao.school.extend.GateWayInfoDaoExtend;
+import com.zhongshu.card.server.core.dao.devices.extend.GateWayInfoDaoExtend;
 import com.zhongshu.card.server.core.domain.devices.GateWayInfo;
 
 import java.util.List;

+ 1 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/extend/DeviceBindDaoExtend.java → FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/extend/DeviceBindDaoExtend.java

@@ -1,4 +1,4 @@
-package com.zhongshu.card.server.core.dao.school.extend;
+package com.zhongshu.card.server.core.dao.devices.extend;
 
 import com.zhongshu.card.client.model.devices.DeviceBindSearch;
 import com.zhongshu.card.server.core.domain.devices.DeviceBind;

+ 1 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/extend/DeviceInfoDaoExtend.java → FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/extend/DeviceInfoDaoExtend.java

@@ -1,4 +1,4 @@
-package com.zhongshu.card.server.core.dao.school.extend;
+package com.zhongshu.card.server.core.dao.devices.extend;
 
 import com.zhongshu.card.client.model.devices.DeviceInfoSearch;
 import com.zhongshu.card.server.core.domain.devices.DeviceInfo;

+ 19 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/extend/DevicePermissDaoExtend.java

@@ -0,0 +1,19 @@
+package com.zhongshu.card.server.core.dao.devices.extend;
+
+import com.zhongshu.card.client.model.devices.DevicePermissSearch;
+import com.zhongshu.card.client.model.org.OrganizationUserSearch;
+import com.zhongshu.card.server.core.domain.devices.DevicePermiss;
+import com.zhongshu.card.server.core.domain.org.OrganizationUser;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+
+/**
+ * @Author TRX
+ * @CreateDate: 2023/7/7
+ * @Version: 1.0
+ */
+public interface DevicePermissDaoExtend {
+
+    Page<DevicePermiss> page(Pageable pageable, DevicePermissSearch param);
+
+}

+ 1 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/extend/GateWayInfoDaoExtend.java → FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/extend/GateWayInfoDaoExtend.java

@@ -1,4 +1,4 @@
-package com.zhongshu.card.server.core.dao.school.extend;
+package com.zhongshu.card.server.core.dao.devices.extend;
 
 import com.zhongshu.card.client.model.devices.GateWayInfoSearch;
 import com.zhongshu.card.server.core.domain.devices.GateWayInfo;

+ 2 - 2
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/impl/DeviceBindDaoImpl.java → FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/impl/DeviceBindDaoImpl.java

@@ -1,9 +1,9 @@
-package com.zhongshu.card.server.core.dao.school.impl;
+package com.zhongshu.card.server.core.dao.devices.impl;
 
 import com.github.microservice.components.data.mongo.mongo.helper.DBHelper;
 import com.zhongshu.card.client.model.devices.DeviceBindSearch;
 import com.zhongshu.card.server.core.dao.BaseImpl;
-import com.zhongshu.card.server.core.dao.school.extend.DeviceBindDaoExtend;
+import com.zhongshu.card.server.core.dao.devices.extend.DeviceBindDaoExtend;
 import com.zhongshu.card.server.core.domain.school.Area;
 import com.zhongshu.card.server.core.domain.devices.DeviceBind;
 import org.apache.commons.lang3.ObjectUtils;

+ 2 - 2
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/impl/DeviceInfoDaoImpl.java → FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/impl/DeviceInfoDaoImpl.java

@@ -1,9 +1,9 @@
-package com.zhongshu.card.server.core.dao.school.impl;
+package com.zhongshu.card.server.core.dao.devices.impl;
 
 import com.github.microservice.components.data.mongo.mongo.helper.DBHelper;
 import com.zhongshu.card.client.model.devices.DeviceInfoSearch;
 import com.zhongshu.card.server.core.dao.BaseImpl;
-import com.zhongshu.card.server.core.dao.school.extend.DeviceInfoDaoExtend;
+import com.zhongshu.card.server.core.dao.devices.extend.DeviceInfoDaoExtend;
 import com.zhongshu.card.server.core.domain.school.Area;
 import com.zhongshu.card.server.core.domain.devices.DeviceInfo;
 import com.zhongshu.card.server.core.util.CommonUtil;

+ 139 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/impl/DevicePermissDaoImpl.java

@@ -0,0 +1,139 @@
+package com.zhongshu.card.server.core.dao.devices.impl;
+
+import com.github.microservice.components.data.mongo.mongo.helper.DBHelper;
+import com.zhongshu.card.client.model.devices.DevicePermissSearch;
+import com.zhongshu.card.client.model.org.OrganizationUserSearch;
+import com.zhongshu.card.server.core.dao.BaseImpl;
+import com.zhongshu.card.server.core.dao.devices.extend.DevicePermissDaoExtend;
+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.OrganizationUserDaoExtend;
+import com.zhongshu.card.server.core.domain.devices.DevicePermiss;
+import com.zhongshu.card.server.core.domain.org.Department;
+import com.zhongshu.card.server.core.domain.org.OrganizationUser;
+import com.zhongshu.card.server.core.domain.org.Role;
+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 DevicePermissDaoImpl extends BaseImpl implements DevicePermissDaoExtend {
+
+    @Autowired
+    private MongoTemplate mongoTemplate;
+
+    @Autowired
+    private DBHelper dbHelper;
+
+    @Autowired
+    RoleDao roleDao;
+
+    @Autowired
+    DepartmentDao departmentDao;
+
+    @Override
+    public Page<DevicePermiss> page(Pageable pageable, DevicePermissSearch param) {
+        Criteria criteria = buildCriteriaNotOid(param);
+
+        // 用户ID
+        if (ObjectUtils.isNotEmpty(param.getUserId())) {
+            criteria.and("userId").is(param.getUserId());
+        }
+
+        // 机构ID
+        if (ObjectUtils.isNotEmpty(param.getUserOid())) {
+            criteria.and("userOid").is(param.getUserOid());
+        }
+
+        // 在这个机构的状态,是否可用
+        if (param.getState() != null) {
+            criteria.and("state").is(param.getState());
+        }
+
+        // 机构类型
+        if (param.getAuthType() != null) {
+            criteria.and("authType").is(param.getAuthType());
+        }
+
+        // 职位
+        if (StringUtils.isNotEmpty(param.getPositionId())) {
+            criteria.and("position.id").is(param.getPositionId());
+        }
+
+        // 角色
+        List<String> roleIds = param.getRoleIds();
+        if (!CollectionUtils.isEmpty(roleIds)) {
+            List<Role> roles = roleDao.findByIdIn(roleIds);
+            criteria.and("roles").in(roles);
+        }
+
+        // 部门
+        List<String> departmentIds = param.getDepartmentIds();
+        if (!CollectionUtils.isEmpty(departmentIds)) {
+            List<Department> roles = departmentDao.findByIdIn(departmentIds);
+            criteria.and("departments").in(roles);
+        }
+
+        // 搜索项目的用户
+        if (StringUtils.isNotEmpty(param.getPositionId())) {
+            criteria.and("projectOid").is(param.getProjectOid());
+        }
+
+        if (param.getIsUsed() != null) {
+            criteria.and("isUsed").is(param.getIsUsed());
+        }
+
+        if (param.getDeviceType() != null) {
+            criteria.and("deviceType").is(param.getDeviceType());
+        }
+
+        // 模糊搜索
+        List<Criteria> criterias = new ArrayList<>();
+//        // 用户名称
+//        if (StringUtils.isNotEmpty(param.getName())) {
+//            Pattern pattern = Pattern.compile("^.*" + param.getName() + ".*$");
+//            criterias.add(Criteria.where("name").is(pattern));
+//        }
+//        if (!CollectionUtils.isEmpty(criterias)) {
+//            criteria.andOperator(criterias.toArray(new Criteria[]{}));
+//        }
+
+        // 关键字搜索
+        if (StringUtils.isNotEmpty(param.getDeviceKeyWord())) {
+            Pattern pattern = Pattern.compile("^.*" + param.getDeviceKeyWord() + ".*$");
+            criteria.orOperator(
+                    Criteria.where("deviceId").regex(pattern),
+                    Criteria.where("deviceName").regex(pattern)
+            );
+        }
+
+        if (StringUtils.isNotEmpty(param.getUserKeyWord())) {
+            Pattern pattern = Pattern.compile("^.*" + param.getUserKeyWord() + ".*$");
+            criteria.orOperator(
+                    Criteria.where("name").regex(pattern),
+                    Criteria.where("code").regex(pattern)
+            );
+        }
+
+        Sort sort = buildSort(param);
+        Query query = Query.query(criteria);
+        query.with(sort);
+        return dbHelper.pages(query, pageable, DevicePermiss.class);
+    }
+
+}

+ 2 - 2
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/impl/GateWayInfoDaoImpl.java → FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/impl/GateWayInfoDaoImpl.java

@@ -1,9 +1,9 @@
-package com.zhongshu.card.server.core.dao.school.impl;
+package com.zhongshu.card.server.core.dao.devices.impl;
 
 import com.github.microservice.components.data.mongo.mongo.helper.DBHelper;
 import com.zhongshu.card.client.model.devices.GateWayInfoSearch;
 import com.zhongshu.card.server.core.dao.BaseImpl;
-import com.zhongshu.card.server.core.dao.school.extend.GateWayInfoDaoExtend;
+import com.zhongshu.card.server.core.dao.devices.extend.GateWayInfoDaoExtend;
 import com.zhongshu.card.server.core.domain.school.Area;
 import com.zhongshu.card.server.core.domain.devices.GateWayInfo;
 import com.zhongshu.card.server.core.util.CommonUtil;

+ 15 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/impl/OrganizationUserDaoImpl.java

@@ -68,6 +68,16 @@ public class OrganizationUserDaoImpl extends BaseImpl implements OrganizationUse
             criteria.and("userType").is(param.getUserType());
         }
 
+        // 机构类型
+        if (param.getAuthType() != null) {
+            criteria.and("authType").is(param.getAuthType());
+        }
+
+        // 不属于某种类型机构
+        if (param.getNotAuthType() != null) {
+            criteria.and("authType").ne(param.getNotAuthType());
+        }
+
         // 在机构里是否是管理员
         if (param.getIsAdmin() != null) {
             criteria.and("isAdmin").is(param.getIsAdmin());
@@ -120,7 +130,11 @@ public class OrganizationUserDaoImpl extends BaseImpl implements OrganizationUse
         // 关键字搜索
         if (StringUtils.isNotEmpty(param.getKeyWord())) {
             Pattern pattern = Pattern.compile("^.*" + param.getKeyWord() + ".*$");
-            criteria.orOperator(Criteria.where("name").regex(pattern), Criteria.where("phone").regex(pattern));
+            criteria.orOperator(
+                    Criteria.where("name").regex(pattern),
+                    Criteria.where("phone").regex(pattern),
+                    Criteria.where("code").regex(pattern)
+            );
         }
 
         Sort sort = buildSort(param);

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

@@ -1,15 +1,27 @@
 package com.zhongshu.card.server.core.domain.devices;
 
+import com.github.microservice.auth.security.type.AuthType;
+import com.github.microservice.models.type.DeviceType;
+import com.zhongshu.card.client.type.UserState;
 import com.zhongshu.card.server.core.domain.base.SuperMain;
+import com.zhongshu.card.server.core.domain.org.Department;
+import com.zhongshu.card.server.core.domain.org.OrganizationUser;
+import com.zhongshu.card.server.core.domain.org.Role;
 import com.zhongshu.card.server.core.domain.org.UserAccount;
+import com.zhongshu.card.server.core.domain.school.Area;
+import com.zhongshu.card.server.core.domain.school.DictInfo;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
+import org.springframework.data.mongodb.core.index.Indexed;
 import org.springframework.data.mongodb.core.mapping.DBRef;
 import org.springframework.data.mongodb.core.mapping.Document;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * 用户可使用设备的绑定
  *
@@ -26,16 +38,63 @@ public class DevicePermiss extends SuperMain {
     @DBRef(lazy = true)
     private DeviceInfo deviceInfo;
 
+    //------------------设备冗余数据 start-------------------
     @Schema(description = "设备ID")
     private String deviceId;
 
+    @Schema(description = "设备名称")
+    private String deviceName;
+
+    @Schema(description = "设备类型,如 消费机 门禁机")
+    private DeviceType deviceType;
+
+    @Schema(description = "区域信息")
+    @DBRef(lazy = true)
+    private Area area;
+
+    @Schema(description = "区域所有上级ID路径,如:a1/a12/a123")
+    private String areaPaths = "";
+
     @Schema(description = "可使用的用户信息")
     @DBRef(lazy = true)
     private UserAccount userAccount;
 
+    @Schema(description = "机构用户信息")
+    @DBRef(lazy = true)
+    private OrganizationUser organizationUser;
+
+    //---------------用户冗余数据 start--------------
+
+    @Schema(description = "用户所属机构的类型")
+    private AuthType authType;
+
     @Schema(description = "可使用用户userId")
     private String userId;
 
+    @Schema(description = "昵称")
+    @Indexed
+    private String name;
+
+    @Schema(description = "编码")
+    private String code;
+
+    @Schema(description = "用户所属机构oid")
+    private String userOid;
+
+    @Schema(description = "职位")
+    private DictInfo position;
+
+    @Schema(description = "角色信息")
+    @DBRef(lazy = true)
+    private List<Role> roles = new ArrayList<>();
+
+    @Schema(description = "部门信息")
+    @DBRef(lazy = true)
+    private Department department;
+
+    @Schema(description = "用户状态")
+    private UserState state = UserState.Normal;
+
     @Schema(description = "权限是否下发")
     private Boolean isUsed = Boolean.FALSE;
 

+ 1 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/devices/DeviceInfoServiceImpl.java

@@ -10,7 +10,7 @@ import com.zhongshu.card.client.model.school.AreaModel;
 import com.zhongshu.card.client.service.school.DeviceInfoService;
 import com.zhongshu.card.server.core.dao.org.OrganizationDao;
 import com.zhongshu.card.server.core.dao.school.AreaDao;
-import com.zhongshu.card.server.core.dao.school.DeviceInfoDao;
+import com.zhongshu.card.server.core.dao.devices.DeviceInfoDao;
 import com.zhongshu.card.server.core.domain.devices.DeviceInfo;
 import com.zhongshu.card.server.core.domain.org.Organization;
 import com.zhongshu.card.server.core.domain.school.Area;

+ 67 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/devices/DevicePermissService.java

@@ -0,0 +1,67 @@
+package com.zhongshu.card.server.core.service.devices;
+
+import com.github.microservice.net.ResultContent;
+import com.zhongshu.card.client.model.devices.DevicePermissModel;
+import com.zhongshu.card.client.model.devices.DevicePermissParam;
+import com.zhongshu.card.client.model.org.OrganizationUserModel;
+import com.zhongshu.card.server.core.dao.devices.DeviceInfoDao;
+import com.zhongshu.card.server.core.dao.devices.DevicePermissDao;
+import com.zhongshu.card.server.core.domain.devices.DeviceInfo;
+import com.zhongshu.card.server.core.domain.devices.DevicePermiss;
+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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 设备权限 (绑定用户)管理
+ *
+ * @author TRX
+ * @date 2024/10/11
+ */
+@Slf4j
+@Service
+public class DevicePermissService extends SuperService {
+
+    @Autowired
+    private DevicePermissDao devicePermissDao;
+
+    @Autowired
+    private DeviceInfoServiceImpl deviceInfoService;
+
+    @Autowired
+    private UserAccountServiceImpl userAccountService;
+
+    @Autowired
+    private DeviceInfoDao deviceInfoDao;
+
+    public ResultContent saveBindInfo(DevicePermissParam param) {
+
+
+        return ResultContent.buildSuccess();
+    }
+
+    public DevicePermissModel toModel(DevicePermiss entity) {
+        DevicePermissModel model = null;
+        if (ObjectUtils.isNotEmpty(entity)) {
+            model = new DevicePermissModel();
+            BeanUtils.copyProperties(entity, model);
+
+            model.setDeviceInfo(deviceInfoService.toModel(entity.getDeviceInfo()));
+
+            OrganizationUserModel organizationUser = userAccountService.toOrgUserModel(entity.getOrganizationUser());
+            model.setOrganizationUser(organizationUser);
+            if (ObjectUtils.isNotEmpty(organizationUser)) {
+                model.setPosition(organizationUser.getPosition());
+                model.setRoles(organizationUser.getRoles());
+                model.setDepartment(organizationUser.getDepartment());
+                model.setState(organizationUser.getState());
+            }
+        }
+        return model;
+    }
+
+}

+ 1 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/devices/GateWayInfoServiceImpl.java

@@ -9,7 +9,7 @@ import com.github.microservice.net.ResultContent;
 import com.zhongshu.card.client.service.school.GateWayInfoService;
 import com.zhongshu.card.server.core.dao.org.OrganizationDao;
 import com.zhongshu.card.server.core.dao.school.AreaDao;
-import com.zhongshu.card.server.core.dao.school.GateWayInfoDao;
+import com.zhongshu.card.server.core.dao.devices.GateWayInfoDao;
 import com.zhongshu.card.server.core.domain.school.Area;
 import com.zhongshu.card.server.core.domain.devices.GateWayInfo;
 import com.zhongshu.card.server.core.service.base.SuperService;

+ 1 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/hxz/HxzService.java

@@ -8,7 +8,7 @@ import com.github.microservice.types.payment.PaymentType;
 import com.zhongshu.card.server.core.dao.school.CardInfoDao;
 import com.zhongshu.card.server.core.dao.org.UserCountDao;
 import com.zhongshu.card.server.core.dao.payment.ExpenseFlowDao;
-import com.zhongshu.card.server.core.dao.school.DeviceInfoDao;
+import com.zhongshu.card.server.core.dao.devices.DeviceInfoDao;
 import com.zhongshu.card.server.core.domain.payment.ExpenseFlow;
 import com.zhongshu.card.server.core.domain.devices.DeviceInfo;
 import com.zhongshu.card.server.core.httpRequest.ApiRequestService;

+ 19 - 7
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/org/OrganizationUserServiceImpl.java

@@ -18,6 +18,7 @@ import com.zhongshu.card.client.type.OrganizationUserType;
 import com.zhongshu.card.client.type.UserState;
 import com.zhongshu.card.server.core.dao.org.*;
 import com.zhongshu.card.server.core.dao.school.DictInfoDao;
+import com.zhongshu.card.server.core.dataConfig.CardSystemDefault;
 import com.zhongshu.card.server.core.domain.org.*;
 import com.zhongshu.card.server.core.domain.school.DictInfo;
 import com.zhongshu.card.server.core.model.org.OrgBindUserParam;
@@ -183,10 +184,12 @@ public class OrganizationUserServiceImpl extends SuperService {
         if (StringUtils.isEmpty(param.getOrgOid())) {
             return ResultContent.buildFail("orgOid不能为空");
         }
+
         UserAccount userAccount = userCountDao.findTopByUserId(param.getUserId());
         if (ObjectUtils.isEmpty(userAccount)) {
             return ResultContent.buildFail(String.format("用户信息不存在:%s", param.getUserId()));
         }
+
         Organization organization = organizationDao.findTopByOid(param.getOrgOid());
         if (ObjectUtils.isEmpty(organization)) {
             return ResultContent.buildFail(String.format("机构信息不存在:%s", param.getOrgOid()));
@@ -207,6 +210,8 @@ public class OrganizationUserServiceImpl extends SuperService {
         } else {
             organizationUser = organizationUserDao.findTopByOrganizationAndUser(organization, userAccount);
         }
+
+
         if (ObjectUtils.isEmpty(organizationUser)) {
             // 添加
             if (ObjectUtils.isNotEmpty(codeTemp)) {
@@ -223,7 +228,7 @@ public class OrganizationUserServiceImpl extends SuperService {
                 return ResultContent.buildFail(String.format("code已存在:%s", param.getCode()));
             }
             // 编辑
-            BeanUtils.copyProperties(param, organizationUser);
+            BeanUtils.copyProperties(param, organizationUser, "id");
 
             // 删除以前的角色
             List<Role> oldRoles = organizationUser.getRoles();
@@ -444,8 +449,10 @@ public class OrganizationUserServiceImpl extends SuperService {
 
         ImportResultModel model = new ImportResultModel();
         try {
-            int startRow = 2;
+            int startRow = 3;
             ImportParams params = new ImportParams();
+            params.setHeadRows(1);
+            params.setTitleRows(1);
             List<ExcelUserParam> list = ExcelImportUtil.importExcel(file.getInputStream(),
                     ExcelUserParam.class, params);
             model.setTotal(list.size());
@@ -487,15 +494,18 @@ public class OrganizationUserServiceImpl extends SuperService {
                         if (StringUtils.isNotBlank(param1.getSexStr())) {
                             addParam.setSex(CommonUtil.getSexByStr(param1.getSexStr()));
                         }
-                        String passWord = param1.getCardNumber().substring(12, 18);
-                        passWord = passWord.toLowerCase().replace("x", "0");
+                        String passWord = CardSystemDefault.DEFAULT_PASSWORD;
+                        if (StringUtils.isNotEmpty(param1.getCardNumber())) {
+                            param1.getCardNumber().substring(12, 18);
+                            passWord = passWord.toLowerCase().replace("x", "0");
+                        }
                         addParam.setPassWord(passWord);
                         userList.add(addParam);
                     }
                     startRow++;
                 }
 
-                // 添加到对应的构中
+                // 添加到对应的构中
                 for (UserCountAddParam param : userList) {
                     ResultContent resultContent = saveOrgUser(param);
                     log.info("添加日志: {}", resultContent.getMsg());
@@ -504,6 +514,7 @@ public class OrganizationUserServiceImpl extends SuperService {
                 model.setFailDetails(failDetails);
             }
         } catch (Exception e) {
+            e.printStackTrace();
             return ResultContent.buildFail(String.format("导入出错:%s", e.getMessage()));
         }
         return ResultContent.buildSuccess(model);
@@ -519,8 +530,9 @@ public class OrganizationUserServiceImpl extends SuperService {
     public void exportProjectUser(HttpServletRequest request, HttpServletResponse response,
             OrganizationUserSearch param) {
         param.setIsSearchProject(Boolean.TRUE);
+        Assert.hasText(param.getProjectOid(), "projectOid不能为空");
 
-        Organization organization = organizationDao.findTopByOid(param.getOid());
+        Organization organization = organizationDao.findTopByOid(param.getProjectOid());
         Pageable pageable = PageRequest.of(0, Integer.MAX_VALUE);
         Page<OrganizationUser> page = organizationUserDao.page(pageable, param);
 
@@ -543,7 +555,7 @@ public class OrganizationUserServiceImpl extends SuperService {
         execlParam.setDatas(maps);
 
         List<CommonExeclTd> tds = new ArrayList<>();
-        tds.add(CommonExeclTd.build("人员编", "code"));
+        tds.add(CommonExeclTd.build("人员编", "code"));
         tds.add(CommonExeclTd.build("姓名", "name"));
         tds.add(CommonExeclTd.build("性别", "sexStr"));
         tds.add(CommonExeclTd.build("手机号", "phone"));

+ 2 - 2
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/payment/ExpenseFlowServiceImpl.java

@@ -33,8 +33,8 @@ import com.zhongshu.card.server.core.dao.projectAbout.ProjectPaySettingDao;
 import com.zhongshu.card.server.core.dao.payment.WalletDao;
 import com.zhongshu.card.server.core.dao.payment.WalletRechargeDao;
 import com.zhongshu.card.server.core.dao.school.CardInfoDao;
-import com.zhongshu.card.server.core.dao.school.DeviceBindDao;
-import com.zhongshu.card.server.core.dao.school.DeviceInfoDao;
+import com.zhongshu.card.server.core.dao.devices.DeviceBindDao;
+import com.zhongshu.card.server.core.dao.devices.DeviceInfoDao;
 import com.zhongshu.card.server.core.domain.devices.DeviceInfo;
 import com.zhongshu.card.server.core.domain.org.Organization;
 import com.zhongshu.card.server.core.domain.org.OrganizationRelation;

+ 42 - 4
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/projectAbout/ProjectCommonConfigService.java

@@ -1,10 +1,7 @@
 package com.zhongshu.card.server.core.service.projectAbout;
 
 import com.github.microservice.net.ResultContent;
-import com.zhongshu.card.client.model.projectAbout.ProjectCommonConfigModel;
-import com.zhongshu.card.client.model.projectAbout.ProjectCommonConfigParam;
-import com.zhongshu.card.client.model.projectAbout.ProjectIotInfoModel;
-import com.zhongshu.card.client.model.projectAbout.ProjectIotInfoParam;
+import com.zhongshu.card.client.model.projectAbout.*;
 import com.zhongshu.card.server.core.dao.org.OrganizationDao;
 import com.zhongshu.card.server.core.dao.projectAbout.ProjectCommonConfigDao;
 import com.zhongshu.card.server.core.domain.org.Organization;
@@ -65,6 +62,37 @@ public class ProjectCommonConfigService extends SuperService {
         return ResultContent.buildSuccess();
     }
 
+    /**
+     * 保存配置信息
+     *
+     * @param param
+     * @return
+     */
+    public ResultContent saveAgreementInfo(ProjectAgreementConfigParam param) {
+        String projectOid = param.getProjectOid();
+        Organization projectInfo = organizationDao.findTopByOid(projectOid);
+        if (ObjectUtils.isEmpty(projectInfo)) {
+            return ResultContent.buildFail(String.format("项目oid不存在:%s", projectOid));
+        }
+        ProjectCommonConfig entity = commonConfigDao.findTopByProjectOid(projectOid);
+        if (ObjectUtils.isEmpty(entity)) {
+            entity = new ProjectCommonConfig();
+            entity.setIsDelete(Boolean.FALSE);
+            initEntityNoOid(entity);
+        } else {
+            initUpdateEntity(entity);
+        }
+        BeanUtils.copyProperties(param, entity);
+        entity.setProjectInfo(projectInfo);
+        entity.setProjectName(projectInfo.getName());
+        entity.setProjectCode(projectInfo.getCode());
+        entity.setOid(projectOid);
+        entity.setAboutOid(projectOid);
+        entity.setAboutAuthType(projectInfo.getAuthType());
+        commonConfigDao.save(entity);
+        return ResultContent.buildSuccess();
+    }
+
     /**
      * 得到项目
      *
@@ -80,6 +108,16 @@ public class ProjectCommonConfigService extends SuperService {
         return ResultContent.buildSuccess(model);
     }
 
+    public ResultContent<ProjectAgreementConfigParam> getAgreementInfo(String projectOid) {
+        ProjectCommonConfig entity = commonConfigDao.findTopByProjectOid(projectOid);
+        ProjectAgreementConfigParam model = null;
+        if (ObjectUtils.isNotEmpty(entity)) {
+            model = new ProjectAgreementConfigParam();
+            org.springframework.beans.BeanUtils.copyProperties(entity, model);
+        }
+        return ResultContent.buildSuccess(model);
+    }
+
     /**
      * 项目是否完成配置
      *

+ 2 - 17
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/projectAbout/ProjectExcelTemplateService.java

@@ -47,22 +47,8 @@ public class ProjectExcelTemplateService extends SuperService {
      */
     public ResultContent saveExcelTemplate(ProjectExcelTemplateParam param) {
         String mark = param.getMark();
-        ProjectExcelTemplate entity = null;
-        ProjectExcelTemplate nameTemp = projectExcelTemplateDao.findTopByMark(mark);
-        if (ObjectUtils.isNotEmpty(param.getId())) {
-            entity = projectExcelTemplateDao.findTopById(param.getId());
-            if (ObjectUtils.isEmpty(entity)) {
-                return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, param.getId()));
-            }
-            if (ObjectUtils.isNotEmpty(nameTemp) && !nameTemp.getId().equals(entity.getId())) {
-                return ResultContent.buildFail(String.format("名称已存在:%s", mark));
-            }
-            initUpdateEntity(entity);
-        } else {
-            if (ObjectUtils.isNotEmpty(nameTemp)) {
-                return ResultContent.buildFail(String.format("名称已存在:%s", mark));
-            }
-            param.setId(null);
+        ProjectExcelTemplate entity = projectExcelTemplateDao.findTopByMark(mark);
+        if (ObjectUtils.isEmpty(entity)) {
             entity = new ProjectExcelTemplate();
             entity.setIsDelete(Boolean.FALSE);
             initEntityNoOid(entity);
@@ -106,7 +92,6 @@ public class ProjectExcelTemplateService extends SuperService {
         if (ObjectUtils.isEmpty(entity)) {
             if (param.getIsInit() != null && param.getIsInit()) {
                 ProjectExcelTemplateParam param1 = new ProjectExcelTemplateParam();
-                param1.setProjectOid(param.getProjectOid());
                 param1.setMark(param.getMark());
                 saveExcelTemplate(param1);
             }

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

@@ -95,6 +95,8 @@ public class CardInfoServiceImpl extends SuperService implements CardInfoService
         String oid = param.getOid();
 
         String code = param.getCode();
+        code = code.trim();
+        param.setCode(code);
         CardInfo cardInfo = new CardInfo();
 
         CardInfo temp = cardInfoDao.findByCode(code);

+ 2 - 2
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/school/DeviceBindServiceImpl.java

@@ -10,8 +10,8 @@ import com.github.microservice.net.ResultMessage;
 import com.zhongshu.card.client.service.school.DeviceBindService;
 import com.zhongshu.card.server.core.dao.org.OrganizationDao;
 import com.zhongshu.card.server.core.dao.school.AreaDao;
-import com.zhongshu.card.server.core.dao.school.DeviceBindDao;
-import com.zhongshu.card.server.core.dao.school.DeviceInfoDao;
+import com.zhongshu.card.server.core.dao.devices.DeviceBindDao;
+import com.zhongshu.card.server.core.dao.devices.DeviceInfoDao;
 import com.zhongshu.card.server.core.domain.devices.DeviceInfo;
 import com.zhongshu.card.server.core.domain.org.Organization;
 import com.zhongshu.card.server.core.domain.school.Area;

+ 9 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/user/UserAccountServiceImpl.java

@@ -30,6 +30,7 @@ import com.zhongshu.card.server.core.domain.org.OrganizationUser;
 import com.zhongshu.card.server.core.domain.org.UserAccount;
 import com.zhongshu.card.server.core.service.base.SuperService;
 import com.zhongshu.card.server.core.service.org.OrganizationUserServiceImpl;
+import com.zhongshu.card.server.core.service.orgManager.OrganizationManagerServiceImpl;
 import com.zhongshu.card.server.core.service.school.DictInfoServiceImpl;
 import com.zhongshu.card.server.core.util.BeanUtils;
 import com.zhongshu.card.server.core.util.CommonUtil;
@@ -64,6 +65,9 @@ public class UserAccountServiceImpl extends SuperService implements UserAccountS
     @Autowired
     OrganizationService organizationService;
 
+    @Autowired
+    OrganizationManagerServiceImpl organizationManagerService;
+
     @Autowired
     UserService userService;
 
@@ -565,6 +569,10 @@ public class UserAccountServiceImpl extends SuperService implements UserAccountS
         if (ObjectUtils.isNotEmpty(entity)) {
             BeanUtils.copyProperties(entity, model);
 
+            // 机构信息
+            OrganizationMiniModel miniModel = organizationManagerService.toMiniModel(entity.getOrganization());
+            model.setOrganization(miniModel);
+
             // 用户信息
             UserCountModel userCountModel = toModel(entity.getUser());
             model.setUser(userCountModel);
@@ -578,6 +586,7 @@ public class UserAccountServiceImpl extends SuperService implements UserAccountS
                 List<RoleModel> roleModels = entity.getRoles().stream().map(roleServiceImpl::toModel).collect(Collectors.toList());
                 model.setRoles(roleModels);
             }
+
             // 部门信息
             if (ObjectUtils.isNotEmpty(entity.getDepartment())) {
                 DepartmentModel departmentModel = departmentService.toModel(entity.getDepartment());