Sfoglia il codice sorgente

Merge remote-tracking branch 'origin/master'

wujiefeng 1 anno fa
parent
commit
b71b91dbb4
44 ha cambiato i file con 1126 aggiunte e 45 eliminazioni
  1. 4 1
      FullCardClient/src/main/java/com/zhongshu/card/client/model/devices/DeviceBindAreaParam.java
  2. 3 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/devices/DeviceInfoModel.java
  3. 41 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/form/ComponentFormModel.java
  4. 2 11
      FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/projectCommon/ProjectAgreementConfigParam.java
  5. 4 1
      FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/projectCommon/ProjectCommonConfigModel.java
  6. 1 1
      FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/projectCommon/ProjectCommonConfigParam.java
  7. 20 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/projectCommon/ProjectCommonSuperParam.java
  8. 4 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/visitor/package-info.java
  9. 25 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/visitor/setting/VisitorSettingDeviceParam.java
  10. 49 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/visitor/setting/VisitorSettingModel.java
  11. 36 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/visitor/setting/VisitorSettingParam.java
  12. 18 0
      FullCardClient/src/main/java/com/zhongshu/card/client/type/permiss/DevicePermissTempType.java
  13. 22 0
      FullCardClient/src/main/java/com/zhongshu/card/client/type/visitor/VisitorState.java
  14. 8 5
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/projectAbout/ProjectCommonConfigController.java
  15. 47 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/visitor/VisitorSettingController.java
  16. 74 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/visitor/VisitorSettingDeviceController.java
  17. 4 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/visitor/package-info.java
  18. 0 2
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/scene/SceneComponentDao.java
  19. 13 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/visitor/VisitorSettingDao.java
  20. 20 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/visitor/VisitorSettingDeviceDao.java
  21. 19 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/visitor/extend/VisitorSettingDeviceDaoExtend.java
  22. 71 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/visitor/impl/VisitorSettingDeviceDaoImpl.java
  23. 4 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/visitor/package-info.java
  24. 3 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/devices/DeviceInfo.java
  25. 1 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/devices/DeviceProduct.java
  26. 1 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/devices/DeviceProductBindDevice.java
  27. 56 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/devices/permiss/Device2UseUsable.java
  28. 4 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/payment/ExpenseFlow.java
  29. 1 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/projectAbout/OrgUserFace.java
  30. 96 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/visitor/VisitorMain.java
  31. 48 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/visitor/VisitorSetting.java
  32. 44 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/visitor/VisitorSettingDevice.java
  33. 39 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/visitor/VisitorSettingDeviceModel.java
  34. 31 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/visitor/VisitorSettingDeviceSearch.java
  35. 4 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/visitor/package-info.java
  36. 6 2
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/devices/DeviceInfoServiceImpl.java
  37. 6 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/devices/deviceProduct/DeviceProductBindDeviceService.java
  38. 6 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/devices/deviceProduct/DeviceProductService.java
  39. 3 2
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/mqtt/MqttServiceImpl.java
  40. 2 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/payment/ExpenseFlowServiceImpl.java
  41. 25 18
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/projectAbout/ProjectCommonConfigService.java
  42. 142 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/visitor/VisitorSettingDeviceService.java
  43. 115 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/visitor/VisitorSettingService.java
  44. 4 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/visitor/package-info.java

+ 4 - 1
FullCardClient/src/main/java/com/zhongshu/card/client/model/devices/DeviceBindAreaParam.java

@@ -7,7 +7,7 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 /**
- * 设备绑定区域的参数
+ * 设备编辑等参数
  *
  * @author TRX
  * @date 2024/10/10
@@ -23,6 +23,9 @@ public class DeviceBindAreaParam {
     @Schema(description = "设备名称")
     private String deviceName;
 
+    @Schema(description = "别名")
+    private String nickName;
+
     @Schema(description = "区域ID")
     private String areaId;
 

+ 3 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/devices/DeviceInfoModel.java

@@ -26,6 +26,9 @@ public class DeviceInfoModel extends SuperModel {
     @Schema(description = "设备名称")
     private String deviceName;
 
+    @Schema(description = "别名")
+    private String nickName;
+
     @Schema(description = "设备类型,如 消费机 门禁机")
     private DeviceType deviceType;
 

+ 41 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/form/ComponentFormModel.java

@@ -0,0 +1,41 @@
+package com.zhongshu.card.client.model.form;
+
+import com.github.microservice.types.payment.PayFieldType;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 组件的表单
+ *
+ * @author TRX
+ * @date 2025/2/11
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ComponentFormModel {
+
+    @Schema(description = "对应的后端字段,如:name、appId")
+    private String key;
+
+    @Schema(description = "字段名称,如:名称,名称")
+    private String name;
+
+    @Schema(description = "字段类型,如:Str, File")
+    private PayFieldType type;
+
+    @Schema(description = "是否必填")
+    private Boolean isMust = Boolean.TRUE;
+
+    @Schema(description = "是否显示")
+    private Boolean isShow = Boolean.TRUE;
+
+    @Schema(description = "备注")
+    private String remark;
+
+    @Schema(description = "最大长度")
+    private Integer maxLength = 500;
+
+}

+ 2 - 11
FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/ProjectAgreementConfigParam.java → FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/projectCommon/ProjectAgreementConfigParam.java

@@ -1,12 +1,7 @@
-package com.zhongshu.card.client.model.projectAbout;
+package com.zhongshu.card.client.model.projectAbout.projectCommon;
 
-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;
@@ -18,11 +13,7 @@ import lombok.NoArgsConstructor;
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
-public class ProjectAgreementConfigParam {
-
-    @NotEmpty
-    @Schema(description = "项目id")
-    private String projectOid;
+public class ProjectAgreementConfigParam extends ProjectCommonSuperParam {
 
     @Schema(description = "用户协议")
     @NotEmpty

+ 4 - 1
FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/ProjectCommonConfigModel.java → FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/projectCommon/ProjectCommonConfigModel.java

@@ -1,4 +1,4 @@
-package com.zhongshu.card.client.model.projectAbout;
+package com.zhongshu.card.client.model.projectAbout.projectCommon;
 
 import com.zhongshu.card.client.type.PassWordDefaultType;
 import com.zhongshu.card.client.type.PassWordType;
@@ -47,6 +47,9 @@ public class ProjectCommonConfigModel {
     @Schema(description = "允许游客消费")
     private Boolean isAllowConsume = Boolean.FALSE;
 
+
+    //----------------协议信息 start---------
+
     @Schema(description = "用户协议")
     private String userAgreement = "";
 

+ 1 - 1
FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/ProjectCommonConfigParam.java → FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/projectCommon/ProjectCommonConfigParam.java

@@ -1,4 +1,4 @@
-package com.zhongshu.card.client.model.projectAbout;
+package com.zhongshu.card.client.model.projectAbout.projectCommon;
 
 import com.zhongshu.card.client.type.PassWordDefaultType;
 import com.zhongshu.card.client.type.PassWordType;

+ 20 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/projectCommon/ProjectCommonSuperParam.java

@@ -0,0 +1,20 @@
+package com.zhongshu.card.client.model.projectAbout.projectCommon;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.Data;
+
+/**
+ * 项目通用设置的超类
+ *
+ * @author TRX
+ * @date 2025/2/10
+ */
+@Data
+public class ProjectCommonSuperParam {
+
+    @NotEmpty
+    @Schema(description = "项目id")
+    private String projectOid;
+
+}

+ 4 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/visitor/package-info.java

@@ -0,0 +1,4 @@
+package com.zhongshu.card.client.model.visitor;
+/**
+ * 访客应用相关的
+ */

+ 25 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/visitor/setting/VisitorSettingDeviceParam.java

@@ -0,0 +1,25 @@
+package com.zhongshu.card.client.model.visitor.setting;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author TRX
+ * @date 2025/2/11
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class VisitorSettingDeviceParam {
+
+    @Schema(description = "组件ID")
+    private String sceneComponentId;
+
+    private List<String> deviceIds = new ArrayList<String>();
+
+}

+ 49 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/visitor/setting/VisitorSettingModel.java

@@ -0,0 +1,49 @@
+package com.zhongshu.card.client.model.visitor.setting;
+
+import com.zhongshu.card.client.model.base.SuperModel;
+import com.zhongshu.card.client.model.form.ComponentFormModel;
+import com.zhongshu.card.client.model.org.role.RoleModel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.apache.commons.lang3.ObjectUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author TRX
+ * @date 2025/2/11
+ */
+@Data
+public class VisitorSettingModel extends SuperModel {
+
+    @Schema(description = "组件id")
+    private String sceneComponentId;
+
+    @Schema(description = "被访人类型设置")
+    private List<RoleModel> visitorRoles;
+
+    @Schema(description = "角色id")
+    private List<String> visitorRoleIds = new ArrayList<>();
+
+    private String visitorRoleNames = "";
+
+    public String getVisitorRoleNames() {
+        if (ObjectUtils.isNotEmpty(visitorRoles)) {
+            List<String> visitorRoleNames = visitorRoles.stream().map(RoleModel::getName).collect(Collectors.toList());
+            return String.join(",", visitorRoleNames);
+        }
+        return "";
+    }
+
+    @Schema(description = "访客类型,值从字典来")
+    private List<String> visitorTypes;
+
+    @Schema(description = "授权时间")
+    private Long minutes;
+
+    @Schema(description = "表单列表")
+    private List<ComponentFormModel> fields = new ArrayList<ComponentFormModel>();
+
+}

+ 36 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/visitor/setting/VisitorSettingParam.java

@@ -0,0 +1,36 @@
+package com.zhongshu.card.client.model.visitor.setting;
+
+import com.zhongshu.card.client.model.form.ComponentFormModel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author TRX
+ * @date 2025/2/11
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class VisitorSettingParam {
+
+    @Schema(description = "组件id")
+    private String sceneComponentId;
+
+    @Schema(description = "被访人类型设置")
+    private List<String> visitorRoleIds;
+
+    @Schema(description = "访客类型,值从字典来")
+    private List<String> visitorTypes;
+
+    @Schema(description = "授权时间")
+    private Long minutes;
+
+    @Schema(description = "表单列表")
+    private List<ComponentFormModel> fields = new ArrayList<ComponentFormModel>();
+
+}

+ 18 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/type/permiss/DevicePermissTempType.java

@@ -0,0 +1,18 @@
+package com.zhongshu.card.client.type.permiss;
+
+import lombok.Getter;
+
+/**
+ * 消息类型
+ */
+public enum DevicePermissTempType {
+    Visitor("访客"),
+    ;
+
+    @Getter
+    private String remark;
+
+    DevicePermissTempType(String remark) {
+        this.remark = remark;
+    }
+}

+ 22 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/type/visitor/VisitorState.java

@@ -0,0 +1,22 @@
+package com.zhongshu.card.client.type.visitor;
+
+import lombok.Getter;
+
+/**
+ * 访客申请状态
+ */
+public enum VisitorState {
+    WaitReView("待审核"),
+    WaitVisit("待来访"),
+    Visit("已到访"),
+    Refuse("已拒绝"),
+    Cancel("已失效"),
+    ;
+
+    @Getter
+    private String remark;
+
+    VisitorState(String remark) {
+        this.remark = remark;
+    }
+}

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

@@ -4,9 +4,9 @@ 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.client.model.projectAbout.projectCommon.ProjectAgreementConfigParam;
+import com.zhongshu.card.client.model.projectAbout.projectCommon.ProjectCommonConfigModel;
+import com.zhongshu.card.client.model.projectAbout.projectCommon.ProjectCommonConfigParam;
 import com.zhongshu.card.server.core.service.projectAbout.ProjectCommonConfigService;
 import io.swagger.v3.oas.annotations.Hidden;
 import io.swagger.v3.oas.annotations.Operation;
@@ -49,18 +49,21 @@ public class ProjectCommonConfigController {
         return projectCommonConfigService.getInfo(param.getProjectOid());
     }
 
+    //----------------------------协议配置 start-------------------------
+
     @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);
+        return projectCommonConfigService.saveCommonConfigInfo(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());
+        ProjectAgreementConfigParam model = new ProjectAgreementConfigParam();
+        return projectCommonConfigService.getCommonConfigInfo(param.getProjectOid(), model);
     }
 
 }

+ 47 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/visitor/VisitorSettingController.java

@@ -0,0 +1,47 @@
+package com.zhongshu.card.server.core.controller.visitor;
+
+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.visitor.setting.VisitorSettingModel;
+import com.zhongshu.card.client.model.visitor.setting.VisitorSettingParam;
+import com.zhongshu.card.server.core.service.visitor.VisitorSettingService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+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;
+
+import javax.validation.Valid;
+
+/**
+ * 组件访客配置
+ *
+ * @author TRX
+ * @date 2024/7/26
+ */
+@RestController
+@RequestMapping("/visitorSetting")
+@Tag(name = "访客管理-配置参数")
+public class VisitorSettingController {
+
+    @Autowired
+    private VisitorSettingService visitorSettingService;
+
+    @Operation(summary = "得到配置", description = "得到配置")
+    @RequestMapping(value = "getInfo", method = {RequestMethod.GET})
+    public ResultContent<VisitorSettingModel> getInfo(IDParam param) {
+        return visitorSettingService.getInfo(param.getId());
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "保存配置", description = "保存配置")
+    @RequestMapping(value = "saveInfo", method = {RequestMethod.POST})
+    public ResultContent saveInfo(@RequestBody @Valid VisitorSettingParam param) {
+        return visitorSettingService.saveInfo(param);
+    }
+
+}

+ 74 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/visitor/VisitorSettingDeviceController.java

@@ -0,0 +1,74 @@
+package com.zhongshu.card.server.core.controller.visitor;
+
+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.base.IDsParam;
+import com.zhongshu.card.client.model.visitor.setting.VisitorSettingDeviceParam;
+import com.zhongshu.card.server.core.domain.visitor.VisitorSettingDeviceModel;
+import com.zhongshu.card.server.core.domain.visitor.VisitorSettingDeviceSearch;
+import com.zhongshu.card.server.core.service.visitor.VisitorSettingDeviceService;
+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("/visitorSettingDevice")
+@Tag(name = "访客管理-关联设备")
+public class VisitorSettingDeviceController {
+
+    @Autowired
+    private VisitorSettingDeviceService visitorSettingDeviceService;
+
+    //-----------------------------关联的设备信息 start--------------------
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "组件绑定设备", description = "组件绑定设备")
+    @RequestMapping(value = "bindDevices", method = {RequestMethod.POST})
+    public ResultContent bindDevices(@RequestBody VisitorSettingDeviceParam param) {
+        return this.visitorSettingDeviceService.bindDevices(param);
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "删除下的设备", description = "删除下的设备")
+    @RequestMapping(value = "deleteComponentDevicesInfo", method = {RequestMethod.POST})
+    public ResultContent deleteComponentDevicesInfo(@RequestBody IDParam param) {
+        return this.visitorSettingDeviceService.deleteComponentDeviceInfo(param.getId());
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "删除下的设备(多个)", description = "删除下的设备(多个)")
+    @RequestMapping(value = "deleteComponentDevicesInfo", method = {RequestMethod.POST})
+    public ResultContent deleteComponentDevicesInfo(@RequestBody IDsParam param) {
+        return this.visitorSettingDeviceService.deleteComponentDevicesInfo(param);
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "设备数据列表-分页查询", description = "设备数据列表-分页查询")
+    @RequestMapping(value = {"pageGroupDevices"}, method = {RequestMethod.POST})
+    public ResultContent<Page<VisitorSettingDeviceModel>> pageGroupDevices(
+            @Parameter(hidden = true) @PageableDefault(page = 0, size = 10) Pageable pageable,
+            @Parameter(required = false) VisitorSettingDeviceSearch param) {
+        Assert.hasText(param.getProjectOid(), "projectOid不能为空");
+        return visitorSettingDeviceService.pageDevices(param, pageable);
+    }
+
+    //-----------------------------关联的设备信息 end----------------------
+
+}

+ 4 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/visitor/package-info.java

@@ -0,0 +1,4 @@
+package com.zhongshu.card.server.core.controller.visitor;
+/**
+ * 访客应用相关的
+ */

+ 0 - 2
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/scene/SceneComponentDao.java

@@ -9,8 +9,6 @@ public interface SceneComponentDao extends MongoDao<SceneComponent> {
 
     SceneComponent findTopById(String id);
 
-
-
     List<SceneComponent> findBySceneInfoIdOrderBySortAsc(String sceneInfoId);
 
     long deleteByIdIn(List<String> ids);

+ 13 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/visitor/VisitorSettingDao.java

@@ -0,0 +1,13 @@
+package com.zhongshu.card.server.core.dao.visitor;
+
+import com.github.microservice.components.data.mongo.mongo.dao.MongoDao;
+import com.zhongshu.card.server.core.domain.visitor.VisitorSetting;
+
+/**
+ * 访客设置
+ */
+public interface VisitorSettingDao extends MongoDao<VisitorSetting> {
+
+    VisitorSetting findTopBySceneComponentId(String sceneComponentId);
+
+}

+ 20 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/visitor/VisitorSettingDeviceDao.java

@@ -0,0 +1,20 @@
+package com.zhongshu.card.server.core.dao.visitor;
+
+import com.github.microservice.components.data.mongo.mongo.dao.MongoDao;
+import com.zhongshu.card.server.core.dao.visitor.extend.VisitorSettingDeviceDaoExtend;
+import com.zhongshu.card.server.core.domain.visitor.VisitorSettingDevice;
+
+import java.util.List;
+
+/**
+ * @author TRX
+ * @date 2024/3/21
+ */
+public interface VisitorSettingDeviceDao extends MongoDao<VisitorSettingDevice>, VisitorSettingDeviceDaoExtend {
+
+    VisitorSettingDevice findTopById(String id);
+
+    List<VisitorSettingDevice> findByIdIn(List<String> ids);
+
+    VisitorSettingDevice findTopBySceneComponentIdAndDeviceId(String sceneComponentId, String deviceId);
+}

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

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

+ 71 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/visitor/impl/VisitorSettingDeviceDaoImpl.java

@@ -0,0 +1,71 @@
+package com.zhongshu.card.server.core.dao.visitor.impl;
+
+import com.github.microservice.components.data.mongo.mongo.helper.DBHelper;
+import com.zhongshu.card.server.core.dao.BaseImpl;
+import com.zhongshu.card.server.core.dao.visitor.extend.VisitorSettingDeviceDaoExtend;
+import com.zhongshu.card.server.core.domain.visitor.VisitorSettingDevice;
+import com.zhongshu.card.server.core.domain.visitor.VisitorSettingDeviceSearch;
+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 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 VisitorSettingDeviceDaoImpl extends BaseImpl implements VisitorSettingDeviceDaoExtend {
+
+    @Autowired
+    private DBHelper dbHelper;
+
+    @Override
+    public Page<VisitorSettingDevice> page(Pageable pageable, VisitorSettingDeviceSearch param) {
+        Criteria criteria = buildFilterCriteria(param);
+
+        Sort sort = buildSort(param);
+        Query query = Query.query(criteria);
+        query.with(sort);
+        return dbHelper.pages(query, pageable, VisitorSettingDevice.class);
+    }
+
+    private Criteria buildFilterCriteria(VisitorSettingDeviceSearch param) {
+        Criteria criteria = buildCriteriaNotOid(param);
+
+        if (StringUtils.isNotEmpty(param.getProjectOid())) {
+            criteria.and("projectOid").is(param.getProjectOid());
+        }
+
+        if (StringUtils.isNotEmpty(param.getSceneComponentId())) {
+            criteria.and("sceneComponentId").is(param.getSceneComponentId());
+        }
+        if (param.getDeviceType() != null) {
+            criteria.and("deviceType").is(param.getDeviceType());
+        }
+
+        // 模糊搜索
+        List<Criteria> criterias = new ArrayList<>();
+        if (StringUtils.isNotEmpty(param.getDeviceId())) {
+            Pattern pattern = Pattern.compile("^.*" + param.getDeviceId() + ".*$");
+            criterias.add(Criteria.where("deviceId").is(pattern));
+        }
+        if (StringUtils.isNotEmpty(param.getDeviceName())) {
+            Pattern pattern = Pattern.compile("^.*" + param.getDeviceName() + ".*$");
+            criterias.add(Criteria.where("deviceName").is(pattern));
+        }
+        if (!CollectionUtils.isEmpty(criterias)) {
+            criteria.andOperator(criterias.toArray(new Criteria[]{}));
+        }
+        return criteria;
+    }
+
+}

+ 4 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/visitor/package-info.java

@@ -0,0 +1,4 @@
+package com.zhongshu.card.server.core.dao.visitor;
+/**
+ * 访客应用相关的
+ */

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

@@ -38,6 +38,9 @@ public class DeviceInfo extends SuperMain {
     @Schema(description = "设备名称")
     private String deviceName;
 
+    @Schema(description = "别名")
+    private String nickName;
+
     @Schema(description = "关联的项目code")
     private String projectInfoCode;
 

+ 1 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/devices/DeviceProduct.java

@@ -11,7 +11,7 @@ import org.springframework.data.mongodb.core.mapping.DBRef;
 import org.springframework.data.mongodb.core.mapping.Document;
 
 /**
- * 设备信息
+ * 产品信息
  *
  * @author TRX
  * @date 2025/1/8

+ 1 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/devices/DeviceProductBindDevice.java

@@ -27,7 +27,7 @@ public class DeviceProductBindDevice extends SuperMain {
     @DBRef(lazy = true)
     private DeviceProduct deviceProduct;
 
-    @Schema(description = "")
+    @Schema(description = "产品信息ID")
     @Indexed
     private String deviceProductId;
 

+ 56 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/devices/permiss/Device2UseUsable.java

@@ -0,0 +1,56 @@
+package com.zhongshu.card.server.core.domain.devices.permiss;
+
+import com.zhongshu.card.client.type.permiss.DevicePermissTempType;
+import com.zhongshu.card.server.core.domain.base.SuperMain;
+import com.zhongshu.card.server.core.domain.org.OrganizationUser;
+import com.zhongshu.card.server.core.domain.org.UserAccount;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.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.Date;
+
+/**
+ * 用户可使用设备临时绑定
+ *
+ * @author TRX
+ * @date 2025/2/11
+ */
+@Data
+@Document
+@NoArgsConstructor
+@AllArgsConstructor
+public class Device2UseUsable extends SuperMain {
+
+    @Schema(description = "可使用的用户信息")
+    @DBRef(lazy = true)
+    private UserAccount userAccount;
+
+    @Schema(description = "机构用户信息")
+    @DBRef(lazy = true)
+    private OrganizationUser organizationUser;
+
+    @Schema(description = "用户userId")
+    private String userId;
+
+    @Schema(description = "临时权限来自哪里")
+    private DevicePermissTempType tempType;
+
+    @Schema(description = "数据id")
+    private String fromDataId;
+
+    @Schema(description = "开始时间")
+    private Long startTime;
+
+    @Schema(description = "结束时间")
+    private Long endTime;
+
+    @Schema(description = "过期时间")
+    @Indexed(expireAfterSeconds = 0)
+    private Date ttl;
+
+}

+ 4 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/payment/ExpenseFlow.java

@@ -1,6 +1,7 @@
 package com.zhongshu.card.server.core.domain.payment;
 
 import cn.hutool.json.JSONObject;
+import com.github.microservice.models.type.DeviceType;
 import com.github.microservice.models.type.OrderFromType;
 import com.github.microservice.pay.client.model.ledger.TransactionLogModel;
 import com.github.microservice.types.OrderModeType;
@@ -109,6 +110,9 @@ public class ExpenseFlow extends SuperMain {
     @Schema(description = "消费机设备ID")
     private String deviceId;
 
+    @Schema(description = "设备类型")
+    private DeviceType deviceType;
+
     @Schema(description = "设备所属区域信息")
     private AreaSimpleModel area;
 

+ 1 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/projectAbout/OrgUserFace.java

@@ -41,4 +41,5 @@ public class OrgUserFace extends SuperMain {
 
     @Schema(description = "权限中心的人脸id")
     private String updateFaceFileId;
+
 }

+ 96 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/visitor/VisitorMain.java

@@ -0,0 +1,96 @@
+package com.zhongshu.card.server.core.domain.visitor;
+
+import com.zhongshu.card.client.type.visitor.VisitorState;
+import com.zhongshu.card.server.core.domain.base.SuperMain;
+import com.zhongshu.card.server.core.domain.devices.DeviceInfo;
+import com.zhongshu.card.server.core.domain.org.OrganizationUser;
+import com.zhongshu.card.server.core.domain.org.UserAccount;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.checkerframework.common.aliasing.qual.NonLeaked;
+import org.springframework.data.mongodb.core.mapping.DBRef;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 访客主信息
+ *
+ * @author TRX
+ * @date 2025/2/11
+ */
+@Data
+@Document
+@AllArgsConstructor
+@NoArgsConstructor
+@NonLeaked
+public class VisitorMain extends SuperMain {
+
+    @Schema(description = "组件id")
+    private String sceneComponentId;
+
+    //-----------------------被访人 start--------------------------
+    @Schema(description = "被访人,也是审核人的用户userId")
+    private String visitorUserId;
+
+    @Schema(description = "被访人用户信息")
+    @DBRef(lazy = true)
+    private UserAccount visitorUserAccount;
+
+    @Schema(description = "被访人机构用户信息")
+    @DBRef(lazy = true)
+    private OrganizationUser organizationUser;
+
+    @Schema(description = "审核时间")
+    private Long reviewTime;
+
+    @Schema(description = "状态")
+    private VisitorState state;
+
+    @Schema(description = "是否已失效")
+    private Boolean isCancel = Boolean.FALSE;
+
+    //-------------------------------申请信息start--------------------
+    @Schema(description = "申请人userId")
+    private String applyUserId;
+
+    @Schema(description = "申请人用户信息")
+    @DBRef(lazy = true)
+    private UserAccount applyUserAccount;
+
+    @Schema(description = "申请人机构用户信息")
+    @DBRef(lazy = true)
+    private OrganizationUser applyOrganizationUser;
+
+    @Schema(description = "手机号码")
+    private String phone;
+
+    @Schema(description = "访客类型")
+    private String visitorType;
+
+    @Schema(description = "身份证号码")
+    private String cardNumber;
+
+    @Schema(description = "车牌号码")
+    private String cardNo;
+
+    @Schema(description = "到访开始时间")
+    private Long startTime;
+
+    @Schema(description = "结束时间")
+    private Long endTime;
+
+    @Schema(description = "访问时间长")
+    private Long minutes;
+
+    @Schema(description = "可使用的设备id集合")
+    private List<String> deviceIds = new ArrayList<>();
+
+    @Schema(description = "设备列表")
+    @DBRef(lazy = true)
+    private List<DeviceInfo> deviceInfos = new ArrayList<>();
+
+}

+ 48 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/visitor/VisitorSetting.java

@@ -0,0 +1,48 @@
+package com.zhongshu.card.server.core.domain.visitor;
+
+import com.zhongshu.card.client.model.form.ComponentFormModel;
+import com.zhongshu.card.server.core.domain.base.SuperMain;
+import com.zhongshu.card.server.core.domain.org.Role;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.checkerframework.common.aliasing.qual.NonLeaked;
+import org.springframework.data.mongodb.core.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;
+
+/**
+ * 组件的访客配置
+ *
+ * @author TRX
+ * @date 2025/2/11
+ */
+@Data
+@Document
+@AllArgsConstructor
+@NoArgsConstructor
+@NonLeaked
+public class VisitorSetting extends SuperMain {
+
+    @Schema(description = "组件id")
+    @Indexed(unique = true)
+    private String sceneComponentId;
+
+    @Schema(description = "被访人类型设置")
+    @DBRef(lazy = true)
+    private List<Role> visitorRoles;
+
+    @Schema(description = "访客类型,值从字典来")
+    private List<String> visitorTypes;
+
+    @Schema(description = "授权时间")
+    private Long minutes;
+
+    @Schema(description = "表单列表")
+    private List<ComponentFormModel> fields = new ArrayList<ComponentFormModel>();
+
+}

+ 44 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/visitor/VisitorSettingDevice.java

@@ -0,0 +1,44 @@
+package com.zhongshu.card.server.core.domain.visitor;
+
+import com.github.microservice.models.type.DeviceType;
+import com.zhongshu.card.server.core.domain.base.SuperMain;
+import com.zhongshu.card.server.core.domain.devices.DeviceInfo;
+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.index.Indexed;
+import org.springframework.data.mongodb.core.mapping.DBRef;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+/**
+ * 组件的访客配置
+ *
+ * @author TRX
+ * @date 2025/2/11
+ */
+@Data
+@Document
+@AllArgsConstructor
+@NoArgsConstructor
+@NonLeaked
+public class VisitorSettingDevice extends SuperMain {
+
+    @Schema(description = "组件id")
+    @Indexed(unique = true)
+    private String sceneComponentId;
+
+    @Schema(description = "设备id")
+    private String deviceId;
+
+    @Schema(description = "设备名称")
+    private String deviceName;
+
+    @Schema(description = "设备类型")
+    private DeviceType deviceType;
+
+    @Schema(description = "设备信息")
+    @DBRef(lazy = true)
+    private DeviceInfo deviceInfo;
+}

+ 39 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/visitor/VisitorSettingDeviceModel.java

@@ -0,0 +1,39 @@
+package com.zhongshu.card.server.core.domain.visitor;
+
+import com.github.microservice.models.type.DeviceType;
+import com.zhongshu.card.client.model.base.SuperModel;
+import com.zhongshu.card.client.model.devices.DeviceInfoModel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.data.mongodb.core.index.Indexed;
+
+/**
+ * @author TRX
+ * @date 2025/2/11
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class VisitorSettingDeviceModel {
+
+    private String id;
+
+    @Schema(description = "组件id")
+    @Indexed(unique = true)
+    private String sceneComponentId;
+
+    @Schema(description = "设备id")
+    private String deviceId;
+
+    @Schema(description = "设备名称")
+    private String deviceName;
+
+    @Schema(description = "设备类型")
+    private DeviceType deviceType;
+
+    @Schema(description = "设备信息")
+    private DeviceInfoModel deviceInfo;
+
+}

+ 31 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/visitor/VisitorSettingDeviceSearch.java

@@ -0,0 +1,31 @@
+package com.zhongshu.card.server.core.domain.visitor;
+
+import com.github.microservice.models.type.DeviceType;
+import com.zhongshu.card.client.model.base.SuperSearch;
+import com.zhongshu.card.server.core.domain.devices.DeviceInfo;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.springframework.data.mongodb.core.index.Indexed;
+import org.springframework.data.mongodb.core.mapping.DBRef;
+
+/**
+ * @author TRX
+ * @date 2025/2/11
+ */
+@Data
+public class VisitorSettingDeviceSearch extends SuperSearch {
+
+    @Schema(description = "组件id")
+    @Indexed(unique = true)
+    private String sceneComponentId;
+
+    @Schema(description = "设备id")
+    private String deviceId;
+
+    @Schema(description = "设备名称")
+    private String deviceName;
+
+    @Schema(description = "设备类型")
+    private DeviceType deviceType;
+
+}

+ 4 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/visitor/package-info.java

@@ -0,0 +1,4 @@
+package com.zhongshu.card.server.core.domain.visitor;
+/**
+ * 访客应用相关的模型
+ */

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

@@ -128,6 +128,10 @@ public class DeviceInfoServiceImpl extends SuperService implements DeviceInfoSer
             deviceInfo.setProjectInfoName(projectInfo.getName());
         }
 
+        // 设备的别名
+        if (StringUtils.isEmpty(deviceInfo.getNickName())) {
+            deviceInfo.setNickName(deviceInfo.getDeviceName());
+        }
         deviceInfoDao.save(deviceInfo);
 
         // 修改其他的关联设备信息
@@ -419,7 +423,7 @@ public class DeviceInfoServiceImpl extends SuperService implements DeviceInfoSer
             }
         }
         deviceInfo.setAboutInfo(param.getAboutInfo());
-
+        deviceInfo.setNickName(param.getNickName());
         deviceInfoDao.save(deviceInfo);
 
         devicePermissEventService.sendDeviceChangeEvent(deviceInfo.getDeviceId(), deviceInfo.getProjectOid(), "updateDevice");
@@ -587,7 +591,7 @@ public class DeviceInfoServiceImpl extends SuperService implements DeviceInfoSer
     }
 
     /**
-     * 得到所属机构
+     * 得到所属机构 ()
      *
      * @param deviceInfo
      * @return

+ 6 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/devices/deviceProduct/DeviceProductBindDeviceService.java

@@ -56,6 +56,12 @@ public class DeviceProductBindDeviceService extends SuperService {
     @Autowired
     private DeviceInfoServiceImpl deviceInfoService;
 
+    /**
+     * 产品绑定设备信息
+     *
+     * @param param
+     * @return
+     */
     public ResultContent bindDevices(DeviceProductBindDeviceBind param) {
         DeviceProduct deviceProduct = deviceProductDao.findTopById(param.getDeviceProductId());
         if (ObjectUtils.isEmpty(deviceProduct)) {

+ 6 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/devices/deviceProduct/DeviceProductService.java

@@ -137,6 +137,12 @@ public class DeviceProductService extends SuperService {
         return ResultContent.buildSuccess();
     }
 
+    /**
+     * 更新产品绑定的设备数量
+     *
+     * @param entity
+     * @return
+     */
     public ResultContent updateNumber(DeviceProduct entity) {
         if (ObjectUtils.isNotEmpty(entity)) {
             String id = entity.getId();

+ 3 - 2
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/mqtt/MqttServiceImpl.java

@@ -2,11 +2,12 @@ package com.zhongshu.card.server.core.service.mqtt;
 
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
+import com.github.microservice.net.ResultContent;
 import com.google.gson.JsonObject;
 import com.zhongshu.card.client.model.mqtt.MqttConfigModel;
 import com.zhongshu.card.client.model.mqtt.SendMessageModel;
-import com.github.microservice.net.ResultContent;
 import com.zhongshu.card.client.type.ArtemisType;
+import com.zhongshu.card.client.utils.DateUtils;
 import com.zhongshu.card.server.core.dao.mqtt.ArtemisMessageDao;
 import com.zhongshu.card.server.core.dao.mqtt.MqttConfigDao;
 import com.zhongshu.card.server.core.dao.org.UserCountDao;
@@ -19,7 +20,6 @@ import com.zhongshu.card.server.core.service.base.SuperService;
 import com.zhongshu.card.server.core.service.mqtt.mqttConfig.client.MQClient;
 import com.zhongshu.card.server.core.service.mqtt.mqttConfig.constant.MQConstant;
 import com.zhongshu.card.server.core.util.BeanUtils;
-import com.zhongshu.card.client.utils.DateUtils;
 import jakarta.jms.Message;
 import jakarta.jms.TextMessage;
 import lombok.extern.slf4j.Slf4j;
@@ -88,6 +88,7 @@ public class MqttServiceImpl extends SuperService {
             jsonObject.addProperty("ttl", 10 * 1000);
             mqClient.sendObject(param.getTopic(), jsonObject.toString());
 
+            // 保存消息记录
             ArtemisMessage artemisMessage = new ArtemisMessage();
             artemisMessage.setJsonObject(jsonObject);
             artemisMessage.setTopIc(param.getTopic());

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

@@ -296,6 +296,8 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
             entity.setShopOid(organization.getOid());
             // 订单关联的机构
             entity.setOid(organization.getOid());
+            // 设备类型
+            entity.setDeviceType(deviceInfo.getDeviceType());
 
             // 设备区域
             entity.setArea(areaService.toSimpleModel(deviceInfo.getArea()));

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

@@ -1,12 +1,13 @@
 package com.zhongshu.card.server.core.service.projectAbout;
 
 import com.github.microservice.net.ResultContent;
-import com.zhongshu.card.client.model.projectAbout.*;
+import com.zhongshu.card.client.model.projectAbout.projectCommon.ProjectCommonConfigModel;
+import com.zhongshu.card.client.model.projectAbout.projectCommon.ProjectCommonConfigParam;
+import com.zhongshu.card.client.model.projectAbout.projectCommon.ProjectCommonSuperParam;
 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;
 import com.zhongshu.card.server.core.domain.projectAbout.ProjectCommonConfig;
-import com.zhongshu.card.server.core.domain.projectAbout.ProjectIotInfo;
 import com.zhongshu.card.server.core.service.base.SuperService;
 import com.zhongshu.card.server.core.util.BeanUtils;
 import lombok.extern.slf4j.Slf4j;
@@ -63,12 +64,27 @@ public class ProjectCommonConfigService extends SuperService {
     }
 
     /**
-     * 保存配置信息
+     * 得到项目
+     *
+     * @param projectOid
+     * @return
+     */
+    public ResultContent<ProjectCommonConfigModel> getInfo(String projectOid) {
+        ProjectCommonConfig entity = commonConfigDao.findTopByProjectOid(projectOid);
+        ProjectCommonConfigModel model = null;
+        if (ObjectUtils.isNotEmpty(entity)) {
+            model = toModel(entity);
+        }
+        return ResultContent.buildSuccess(model);
+    }
+
+    /**
+     * 保存通用配置信息
      *
      * @param param
      * @return
      */
-    public ResultContent saveAgreementInfo(ProjectAgreementConfigParam param) {
+    public ResultContent saveCommonConfigInfo(ProjectCommonSuperParam param) {
         String projectOid = param.getProjectOid();
         Organization projectInfo = organizationDao.findTopByOid(projectOid);
         if (ObjectUtils.isEmpty(projectInfo)) {
@@ -83,6 +99,7 @@ public class ProjectCommonConfigService extends SuperService {
             initUpdateEntity(entity);
         }
         BeanUtils.copyProperties(param, entity);
+
         entity.setProjectInfo(projectInfo);
         entity.setProjectName(projectInfo.getName());
         entity.setProjectCode(projectInfo.getCode());
@@ -94,25 +111,15 @@ public class ProjectCommonConfigService extends SuperService {
     }
 
     /**
-     * 得到项目
+     * 通用得到配置信息
      *
      * @param projectOid
+     * @param model
      * @return
      */
-    public ResultContent<ProjectCommonConfigModel> getInfo(String projectOid) {
-        ProjectCommonConfig entity = commonConfigDao.findTopByProjectOid(projectOid);
-        ProjectCommonConfigModel model = null;
-        if (ObjectUtils.isNotEmpty(entity)) {
-            model = toModel(entity);
-        }
-        return ResultContent.buildSuccess(model);
-    }
-
-    public ResultContent<ProjectAgreementConfigParam> getAgreementInfo(String projectOid) {
+    public ResultContent getCommonConfigInfo(String projectOid, ProjectCommonSuperParam model) {
         ProjectCommonConfig entity = commonConfigDao.findTopByProjectOid(projectOid);
-        ProjectAgreementConfigParam model = null;
-        if (ObjectUtils.isNotEmpty(entity)) {
-            model = new ProjectAgreementConfigParam();
+        if (ObjectUtils.isNotEmpty(entity) && ObjectUtils.isNotEmpty(model)) {
             org.springframework.beans.BeanUtils.copyProperties(entity, model);
         }
         return ResultContent.buildSuccess(model);

+ 142 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/visitor/VisitorSettingDeviceService.java

@@ -0,0 +1,142 @@
+package com.zhongshu.card.server.core.service.visitor;
+
+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.base.IDsParam;
+import com.zhongshu.card.client.model.visitor.setting.VisitorSettingDeviceParam;
+import com.zhongshu.card.server.core.dao.devices.DeviceInfoDao;
+import com.zhongshu.card.server.core.dao.org.OrganizationDao;
+import com.zhongshu.card.server.core.dao.scene.SceneComponentDao;
+import com.zhongshu.card.server.core.dao.visitor.VisitorSettingDeviceDao;
+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.scene.SceneComponent;
+import com.zhongshu.card.server.core.domain.visitor.VisitorSettingDevice;
+import com.zhongshu.card.server.core.domain.visitor.VisitorSettingDeviceModel;
+import com.zhongshu.card.server.core.domain.visitor.VisitorSettingDeviceSearch;
+import com.zhongshu.card.server.core.service.base.SuperService;
+import com.zhongshu.card.server.core.service.devices.DeviceInfoServiceImpl;
+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 java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 组件关联的设备
+ *
+ * @author TRX
+ * @date 2024/12/19
+ */
+@Slf4j
+@Service
+public class VisitorSettingDeviceService extends SuperService {
+
+    @Autowired
+    private OrganizationDao organizationDao;
+
+    @Autowired
+    private DeviceInfoDao deviceInfoDao;
+
+    @Autowired
+    private DeviceInfoServiceImpl deviceInfoService;
+
+    @Autowired
+    private VisitorSettingDeviceDao visitorSettingDeviceDao;
+
+    @Autowired
+    private SceneComponentDao sceneComponentDao;
+
+    //-----------------------------分组关联的设备信息 start--------------------
+
+    public ResultContent bindDevices(VisitorSettingDeviceParam param) {
+        SceneComponent sceneComponent = sceneComponentDao.findTopById(param.getSceneComponentId());
+        if (ObjectUtils.isEmpty(sceneComponent)) {
+            return ResultContent.buildFail("组件不存在");
+        }
+        if (ObjectUtils.isEmpty(param.getDeviceIds())) {
+            return ResultContent.buildFail("设备信息为空");
+        }
+        List<DeviceInfo> list = deviceInfoDao.findByDeviceIdIn(param.getDeviceIds());
+        if (ObjectUtils.isEmpty(list)) {
+            return ResultContent.buildFail("未查询到设备");
+        }
+        if (ObjectUtils.isNotEmpty(list)) {
+            List<VisitorSettingDevice> saveList = new ArrayList<>();
+
+            for (DeviceInfo deviceInfo : list) {
+                VisitorSettingDevice entity = visitorSettingDeviceDao.findTopBySceneComponentIdAndDeviceId(param.getSceneComponentId(), deviceInfo.getDeviceId());
+                if (ObjectUtils.isEmpty(entity)) {
+                    entity = new VisitorSettingDevice();
+                    entity.setDeviceInfo(deviceInfo);
+                    entity.setSceneComponentId(sceneComponent.getId());
+                    entity.setProjectOid(sceneComponent.getProjectOid());
+                    entity.setDeviceId(deviceInfo.getDeviceId());
+                    initEntity(entity);
+                } else {
+                    initUpdateEntity(entity);
+                }
+                entity.setDeviceName(deviceInfo.getDeviceName());
+                entity.setDeviceType(deviceInfo.getDeviceType());
+                saveList.add(entity);
+            }
+            if (ObjectUtils.isNotEmpty(saveList)) {
+                visitorSettingDeviceDao.saveAll(saveList);
+            }
+        }
+        return ResultContent.buildSuccess();
+    }
+
+    public ResultContent deleteComponentDeviceInfo(String id) {
+        VisitorSettingDevice entity = visitorSettingDeviceDao.findTopById(id);
+        if (ObjectUtils.isEmpty(entity)) {
+            return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, id));
+        }
+        visitorSettingDeviceDao.delete(entity);
+        return ResultContent.buildSuccess();
+    }
+
+    public ResultContent deleteComponentDevicesInfo(IDsParam param) {
+        if (ObjectUtils.isEmpty(param.getIds())) {
+            return ResultContent.buildFail("ids不能为空");
+        }
+        List<VisitorSettingDevice> list = visitorSettingDeviceDao.findByIdIn(param.getIds());
+        if (ObjectUtils.isEmpty(list)) {
+            return ResultContent.buildFail("数据不存在");
+        }
+        visitorSettingDeviceDao.deleteAllById(param.getIds());
+        return ResultContent.buildSuccess();
+    }
+
+    public ResultContent<Page<VisitorSettingDeviceModel>> pageDevices(VisitorSettingDeviceSearch param, Pageable pageable) {
+        String projectOid = param.getProjectOid();
+        Organization organization = organizationDao.findTopByOid(projectOid);
+        if (ObjectUtils.isEmpty(organization)) {
+            return ResultContent.buildFail("projectOid不存在");
+        }
+        if (StringUtils.isEmpty(param.getSceneComponentId())) {
+            return ResultContent.buildFail("sceneComponentId 不能为空");
+        }
+        Page<VisitorSettingDevice> page = visitorSettingDeviceDao.page(pageable, param);
+        return ResultContent.buildSuccess(PageEntityUtil.concurrent2PageModel(page, this::toDeviceModel));
+    }
+
+    //-----------------------------分组关联的设备信息 end----------------------
+
+    public VisitorSettingDeviceModel toDeviceModel(VisitorSettingDevice entity) {
+        VisitorSettingDeviceModel model = null;
+        if (ObjectUtils.isNotEmpty(entity)) {
+            model = new VisitorSettingDeviceModel();
+            model.setId(entity.getId());
+            model.setDeviceInfo(deviceInfoService.toModel(entity.getDeviceInfo()));
+        }
+        return model;
+    }
+
+}

+ 115 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/visitor/VisitorSettingService.java

@@ -0,0 +1,115 @@
+package com.zhongshu.card.server.core.service.visitor;
+
+import com.github.microservice.net.ResultContent;
+import com.zhongshu.card.client.model.visitor.setting.VisitorSettingModel;
+import com.zhongshu.card.client.model.visitor.setting.VisitorSettingParam;
+import com.zhongshu.card.server.core.dao.devices.DeviceProductBindDeviceDao;
+import com.zhongshu.card.server.core.dao.devices.DeviceProductDao;
+import com.zhongshu.card.server.core.dao.devices.DeviceProductProvideServeDao;
+import com.zhongshu.card.server.core.dao.org.OrganizationDao;
+import com.zhongshu.card.server.core.dao.org.RoleDao;
+import com.zhongshu.card.server.core.dao.scene.SceneComponentDao;
+import com.zhongshu.card.server.core.dao.visitor.VisitorSettingDao;
+import com.zhongshu.card.server.core.domain.org.Role;
+import com.zhongshu.card.server.core.domain.scene.SceneComponent;
+import com.zhongshu.card.server.core.domain.visitor.VisitorSetting;
+import com.zhongshu.card.server.core.service.base.SuperService;
+import com.zhongshu.card.server.core.service.org.OrganizationServiceImpl;
+import com.zhongshu.card.server.core.service.user.RoleServiceImpl;
+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;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author TRX
+ * @date 2025/1/8
+ */
+@Slf4j
+@Service
+public class VisitorSettingService extends SuperService {
+
+    @Autowired
+    private DeviceProductDao deviceProductDao;
+
+    @Autowired
+    private DeviceProductBindDeviceDao deviceProductBindDeviceDao;
+
+    @Autowired
+    private DeviceProductProvideServeDao deviceProductProvideServeDao;
+
+    @Autowired
+    private OrganizationDao organizationDao;
+
+    @Autowired
+    private OrganizationServiceImpl organizationService;
+
+    @Autowired
+    private VisitorSettingDao visitorSettingDao;
+
+    @Autowired
+    private SceneComponentDao sceneComponentDao;
+
+    @Autowired
+    private RoleDao roleDao;
+
+    @Autowired
+    private RoleServiceImpl roleService;
+
+    /**
+     * 保存组件访客配置
+     *
+     * @param param
+     * @return
+     */
+    public ResultContent saveInfo(VisitorSettingParam param) {
+        SceneComponent sceneComponent = sceneComponentDao.findTopById(param.getSceneComponentId());
+        if (ObjectUtils.isEmpty(sceneComponent)) {
+            return ResultContent.buildFail("组件不存在");
+        }
+
+        VisitorSetting visitorSetting = visitorSettingDao.findTopBySceneComponentId(sceneComponent.getId());
+        if (ObjectUtils.isEmpty(visitorSetting)) {
+            visitorSetting = new VisitorSetting();
+            visitorSetting.setSceneComponentId(sceneComponent.getId());
+            initEntityNoCheckOid(visitorSetting);
+            visitorSetting.setProjectOid(sceneComponent.getProjectOid());
+        } else {
+            initUpdateEntity(visitorSetting);
+        }
+        BeanUtils.copyProperties(param, visitorSetting);
+        List<Role> visitorRoles = new ArrayList<>();
+        if (ObjectUtils.isNotEmpty(param.getVisitorRoleIds())) {
+            visitorRoles = roleDao.findByIdIn(param.getVisitorRoleIds());
+        }
+        visitorSetting.setVisitorRoles(visitorRoles);
+        visitorSettingDao.save(visitorSetting);
+        return ResultContent.buildSuccess();
+    }
+
+    /**
+     * 得到组件访客配置
+     *
+     * @param sceneComponentId
+     * @return
+     */
+    public ResultContent<VisitorSettingModel> getInfo(String sceneComponentId) {
+        VisitorSetting visitorSetting = visitorSettingDao.findTopBySceneComponentId(sceneComponentId);
+        return ResultContent.buildSuccess(toModel(visitorSetting));
+    }
+
+    public VisitorSettingModel toModel(VisitorSetting entity) {
+        VisitorSettingModel model = new VisitorSettingModel();
+        if (ObjectUtils.isNotEmpty(entity)) {
+            BeanUtils.copyProperties(entity, model);
+
+            // 角色数据
+            model.setVisitorRoles(roleService.toModels(entity.getVisitorRoles()));
+        }
+        return model;
+    }
+}

+ 4 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/visitor/package-info.java

@@ -0,0 +1,4 @@
+package com.zhongshu.card.server.core.service.visitor;
+/**
+ * 访客应用相关的
+ */