TRX 1 år sedan
förälder
incheckning
c3061c17da
16 ändrade filer med 581 tillägg och 4 borttagningar
  1. 38 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/school/DeviceInfoModel.java
  2. 16 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/school/DeviceInfoMoreModel.java
  3. 38 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/school/DeviceInfoParam.java
  4. 42 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/school/DeviceInfoSearch.java
  5. 24 0
      FullCardClient/src/main/java/com/zhongshu/card/client/service/school/DeviceInfoService.java
  6. 71 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/school/DeviceInfoController.java
  7. 1 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/school/DictInfoController.java
  8. 9 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/school/SchoolUserController.java
  9. 25 2
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/BaseImpl.java
  10. 21 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/DeviceInfoDao.java
  11. 19 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/extend/DeviceInfoDaoExtend.java
  12. 105 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/impl/DeviceInfoDaoImpl.java
  13. 18 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/school/DeviceInfo.java
  14. 3 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/base/SuperService.java
  15. 149 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/school/DeviceInfoServiceImpl.java
  16. 2 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/school/SchoolUserServiceImpl.java

+ 38 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/school/DeviceInfoModel.java

@@ -0,0 +1,38 @@
+package com.zhongshu.card.client.model.school;
+
+import com.zhongshu.card.client.model.base.SuperModel;
+import com.zhongshu.card.client.utils.type.DeviceType;
+import com.zhongshu.card.client.utils.type.OnLineState;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @author TRX
+ * @date 2024/6/14
+ */
+@Data
+public class DeviceInfoModel extends SuperModel {
+    @Schema(description = "设备ID")
+    private String deviceId;
+
+    @Schema(description = "设备名称")
+    private String deviceName;
+
+    @Schema(description = "设备编号")
+    private String code;
+
+    @Schema(description = "设备类型,如 消费机 门禁机")
+    private DeviceType deviceType;
+
+    @Schema(description = "网关号")
+    private String gateWayCode;
+
+    @Schema(description = "所属区域")
+    private AreaModel area;
+
+    @Schema(description = "是否在线")
+    private OnLineState onLineState = OnLineState.OnLine;
+
+    @Schema(description = "设备IP地址")
+    private String ip;
+}

+ 16 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/school/DeviceInfoMoreModel.java

@@ -0,0 +1,16 @@
+package com.zhongshu.card.client.model.school;
+
+import com.zhongshu.card.client.model.base.SuperModel;
+import com.zhongshu.card.client.utils.type.DeviceType;
+import com.zhongshu.card.client.utils.type.OnLineState;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @author TRX
+ * @date 2024/6/14
+ */
+@Data
+public class DeviceInfoMoreModel extends DeviceInfoModel {
+
+}

+ 38 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/school/DeviceInfoParam.java

@@ -0,0 +1,38 @@
+package com.zhongshu.card.client.model.school;
+
+import com.zhongshu.card.client.model.base.SuperParam;
+import com.zhongshu.card.client.utils.type.DeviceType;
+import com.zhongshu.card.client.utils.type.OnLineState;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @author TRX
+ * @date 2024/6/14
+ */
+@Data
+public class DeviceInfoParam extends SuperParam {
+    @Schema(description = "设备ID")
+    private String deviceId;
+
+    @Schema(description = "设备名称")
+    private String deviceName;
+
+    @Schema(description = "设备编号")
+    private String code;
+
+    @Schema(description = "设备类型,如 消费机 门禁机")
+    private DeviceType deviceType;
+
+    @Schema(description = "网关号")
+    private String gateWayCode;
+
+    @Schema(description = "所属区域")
+    private String areaId;
+
+    @Schema(description = "是否在线")
+    private OnLineState onLineState = OnLineState.OnLine;
+
+    @Schema(description = "设备IP地址")
+    private String ip;
+}

+ 42 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/school/DeviceInfoSearch.java

@@ -0,0 +1,42 @@
+package com.zhongshu.card.client.model.school;
+
+import com.zhongshu.card.client.model.base.SuperSearch;
+import com.zhongshu.card.client.utils.type.DeviceType;
+import com.zhongshu.card.client.utils.type.OnLineState;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @author TRX
+ * @date 2024/6/14
+ */
+@Data
+public class DeviceInfoSearch extends SuperSearch {
+
+    @Schema(description = "关键字搜索")
+    private String keyWord;
+
+    @Schema(description = "设备ID")
+    private String deviceId;
+
+    @Schema(description = "设备名称")
+    private String deviceName;
+
+    @Schema(description = "设备编号")
+    private String code;
+
+    @Schema(description = "设备类型,如 消费机 门禁机")
+    private DeviceType deviceType;
+
+    @Schema(description = "网关号")
+    private String gateWayCode;
+
+    @Schema(description = "所属区域")
+    private String areaId;
+
+    @Schema(description = "是否在线")
+    private OnLineState onLineState;
+
+    @Schema(description = "设备IP地址")
+    private String ip;
+}

+ 24 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/service/school/DeviceInfoService.java

@@ -0,0 +1,24 @@
+package com.zhongshu.card.client.service.school;
+
+import com.zhongshu.card.client.model.school.DeviceInfoModel;
+import com.zhongshu.card.client.model.school.DeviceInfoMoreModel;
+import com.zhongshu.card.client.model.school.DeviceInfoParam;
+import com.zhongshu.card.client.model.school.DeviceInfoSearch;
+import com.zhongshu.card.client.ret.ResultContent;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+
+/**
+ * @author TRX
+ * @date 2024/6/14
+ */
+public interface DeviceInfoService {
+
+    ResultContent addDeviceInfo(DeviceInfoParam param);
+
+    ResultContent<Page<DeviceInfoModel>> page(DeviceInfoSearch param, Pageable pageable);
+
+    ResultContent deleteDeviceInfo(String id);
+
+    ResultContent<DeviceInfoMoreModel> getDeviceDetail(String id);
+}

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

@@ -0,0 +1,71 @@
+package com.zhongshu.card.server.core.controller.school;
+
+import com.github.microservice.auth.security.annotations.ResourceAuth;
+import com.github.microservice.auth.security.type.AuthType;
+import com.zhongshu.card.client.model.base.IDParam;
+import com.zhongshu.card.client.model.school.*;
+import com.zhongshu.card.client.ret.ResultContent;
+import com.zhongshu.card.client.service.school.BookInfoService;
+import com.zhongshu.card.client.service.school.DeviceInfoService;
+import com.zhongshu.card.client.service.school.DictInfoService;
+import com.zhongshu.card.client.service.school.NoticeInfoService;
+import com.zhongshu.card.server.core.service.org.RoleServiceImpl;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 设备
+ *
+ * @author TRX
+ * @date 2024/6/5
+ */
+@RestController
+@RequestMapping("/school/device")
+@Tag(name = "学校-设备管理")
+public class DeviceInfoController {
+
+    @Autowired
+    DeviceInfoService deviceInfoService;
+
+    @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 = "getDeviceDetail", method = {RequestMethod.POST})
+    public ResultContent<DeviceInfoMoreModel> getDeviceDetail(@RequestBody IDParam param) {
+        return this.deviceInfoService.getDeviceDetail(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) {
+        return deviceInfoService.page(param, pageable);
+    }
+
+}

+ 1 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/school/DictInfoController.java

@@ -71,7 +71,7 @@ public class DictInfoController {
     @ResourceAuth(value = "user", type = AuthType.User)
     @Operation(summary = "字典列表-分页查询", description = "字典列表-分页查询")
     @RequestMapping(value = {"page"}, method = {RequestMethod.POST})
-    public ResultContent<Page<DictInfoParam>> pageTeacher(
+    public ResultContent<Page<DictInfoParam>> page(
             @Parameter(hidden = true) @PageableDefault(page = 0, size = 10) Pageable pageable,
             @Parameter(required = false) DictInfoSearch param) {
         return dictInfoService.page(param, pageable);

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

@@ -6,6 +6,7 @@ import com.zhongshu.card.client.model.base.IDParam;
 import com.zhongshu.card.client.model.org.OrgUserDetailParam;
 import com.zhongshu.card.client.model.org.OrganizationUserModel;
 import com.zhongshu.card.client.model.org.OrganizationUserSearch;
+import com.zhongshu.card.client.model.org.SchoolUserCountParam;
 import com.zhongshu.card.client.model.school.FileParam;
 import com.zhongshu.card.client.model.school.ImportUserModel;
 import com.zhongshu.card.client.model.school.SchoolUserModel;
@@ -75,6 +76,14 @@ public class SchoolUserController {
         return userAccountService.pageOrgUser(param, pageable);
     }
 
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "添加-编辑校园端用户", description = "添加-编辑校园端用户")
+    @RequestMapping(value = {"addOrUpdateSchoolUser"}, method = {RequestMethod.POST})
+    public ResultContent addOrUpdateSchoolUser(@RequestBody SchoolUserCountParam param) {
+        return schoolUserService.addOrUpdateSchoolUser(param);
+    }
+
+
     @ResourceAuth(value = "user", type = AuthType.User)
     @Operation(summary = "删除校园端用户", description = "删除校园端用户")
     @RequestMapping(value = {"deleteSchoolUser"}, method = {RequestMethod.POST})

+ 25 - 2
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/BaseImpl.java

@@ -3,6 +3,7 @@ package com.zhongshu.card.server.core.dao;
 import com.zhongshu.card.client.model.base.SuperSearch;
 import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.query.Criteria;
 
 /**
  * @author TRX
@@ -10,13 +11,35 @@ import org.springframework.data.domain.Sort;
  */
 public abstract class BaseImpl {
 
+    /**
+     * 通用创建搜索条件
+     *
+     * @param param
+     * @return
+     */
+    public Criteria buildCriteria(SuperSearch param) {
+        Criteria criteria = new Criteria();
+        // 机构ID
+        if (ObjectUtils.isNotEmpty(param.getOid())) {
+            criteria.and("oid").is(param.getOid());
+        }
+        criteria.and("isDelete").is(Boolean.FALSE);
+        return criteria;
+    }
+
+    /**
+     * 排序
+     *
+     * @param param
+     * @return
+     */
     public Sort buildSort(SuperSearch param) {
         Sort sort = param.getOrderSort();
-        if (param.getIsSortDesc() != null) {
+        if (sort == null && param.getIsSortDesc() != null) {
             if (param.getIsSortDesc()) {
                 // 倒序
                 sort = Sort.by(Sort.Order.desc("sort"), Sort.Order.desc("createTime"));
-            }else {
+            } else {
                 // 升序
                 sort = Sort.by(Sort.Order.asc("sort"), Sort.Order.desc("createTime"));
             }

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

@@ -0,0 +1,21 @@
+package com.zhongshu.card.server.core.dao.school;
+
+import com.github.microservice.components.data.mongo.mongo.dao.MongoDao;
+import com.zhongshu.card.server.core.dao.school.extend.DeviceInfoDaoExtend;
+import com.zhongshu.card.server.core.domain.school.Area;
+import com.zhongshu.card.server.core.domain.school.DeviceInfo;
+
+import java.util.List;
+
+/**
+ * 设备Dao
+ *
+ * @author TRX
+ * @date 2024/3/21
+ */
+public interface DeviceInfoDao extends MongoDao<DeviceInfo>, DeviceInfoDaoExtend {
+
+    DeviceInfo findTopById(String id);
+
+    DeviceInfo findTopByCodeAndOid(String code, String oid);
+}

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

@@ -0,0 +1,19 @@
+package com.zhongshu.card.server.core.dao.school.extend;
+
+import com.zhongshu.card.client.model.school.BookInfoSearch;
+import com.zhongshu.card.client.model.school.DeviceInfoSearch;
+import com.zhongshu.card.server.core.domain.school.BookInfo;
+import com.zhongshu.card.server.core.domain.school.DeviceInfo;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+
+/**
+ * 设备管理
+ *
+ * @Author TRX
+ * @CreateDate: 2023/7/7
+ * @Version: 1.0
+ */
+public interface DeviceInfoDaoExtend {
+    Page<DeviceInfo> page(Pageable pageable, DeviceInfoSearch param);
+}

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

@@ -0,0 +1,105 @@
+package com.zhongshu.card.server.core.dao.school.impl;
+
+import com.github.microservice.components.data.mongo.mongo.helper.DBHelper;
+import com.zhongshu.card.client.model.school.BookInfoSearch;
+import com.zhongshu.card.client.model.school.DeviceInfoSearch;
+import com.zhongshu.card.server.core.dao.BaseImpl;
+import com.zhongshu.card.server.core.dao.school.extend.BookInfoDaoExtend;
+import com.zhongshu.card.server.core.dao.school.extend.DeviceInfoDaoExtend;
+import com.zhongshu.card.server.core.domain.org.Department;
+import com.zhongshu.card.server.core.domain.school.Area;
+import com.zhongshu.card.server.core.domain.school.BookInfo;
+import com.zhongshu.card.server.core.domain.school.DeviceInfo;
+import com.zhongshu.card.server.core.util.CommonUtil;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Pattern;
+
+/**
+ * @Author TRX
+ * @CreateDate: 2023/4/12
+ * @Version: 1.0
+ */
+public class DeviceInfoDaoImpl extends BaseImpl implements DeviceInfoDaoExtend {
+
+    @Autowired
+    private MongoTemplate mongoTemplate;
+
+    @Autowired
+    private DBHelper dbHelper;
+
+    @Override
+    public Page<DeviceInfo> page(Pageable pageable, DeviceInfoSearch param) {
+        Criteria criteria = buildCriteria(param);
+
+        if (param.getDeviceType() != null) {
+            criteria.and("deviceType").is(param.getDeviceType());
+        }
+
+        if (param.getOnLineState() != null) {
+            criteria.and("onLineState").is(param.getOnLineState());
+        }
+
+        if (StringUtils.isNotEmpty(param.getAreaId())) {
+            criteria.and("area").is(Area.build(param.getAreaId()));
+        }
+
+        if (!CommonUtil.longIsEmpty(param.getStartTime()) && !CommonUtil.longIsEmpty(param.getEndTime())) {
+            criteria.and("createTime").gte(param.getStartTime()).and("createTime").lte(param.getEndTime());
+        }
+
+        // 模糊搜索
+        List<Criteria> criterias = new ArrayList<>();
+        if (StringUtils.isNotEmpty(param.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 (StringUtils.isNotEmpty(param.getCode())) {
+            Pattern pattern = Pattern.compile("^.*" + param.getCode() + ".*$");
+            criterias.add(Criteria.where("code").is(pattern));
+        }
+        if (StringUtils.isNotEmpty(param.getGateWayCode())) {
+            Pattern pattern = Pattern.compile("^.*" + param.getGateWayCode() + ".*$");
+            criterias.add(Criteria.where("gateWayCode").is(pattern));
+        }
+
+        if (StringUtils.isNotEmpty(param.getIp())) {
+            Pattern pattern = Pattern.compile("^.*" + param.getIp() + ".*$");
+            criterias.add(Criteria.where("ip").is(pattern));
+        }
+        if (!CollectionUtils.isEmpty(criterias)) {
+            criteria.andOperator(criterias.toArray(new Criteria[]{}));
+        }
+
+        if (StringUtils.isNotEmpty(param.getKeyWord())) {
+            Pattern pattern = Pattern.compile("^.*" + param.getKeyWord() + ".*$");
+            criteria.orOperator(
+                    Criteria.where("deviceId").regex(pattern),
+                    Criteria.where("deviceName").regex(pattern),
+                    Criteria.where("code").regex(pattern),
+                    Criteria.where("gateWayCode").regex(pattern),
+                    Criteria.where("ip").regex(pattern)
+            );
+        }
+        Sort sort = buildSort(param);
+        Query query = Query.query(criteria);
+        query.with(sort);
+        return dbHelper.pages(query, pageable, DeviceInfo.class);
+    }
+
+}

+ 18 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/school/DeviceInfo.java

@@ -1,11 +1,13 @@
 package com.zhongshu.card.server.core.domain.school;
 
 import com.zhongshu.card.client.utils.type.DeviceType;
+import com.zhongshu.card.client.utils.type.OnLineState;
 import com.zhongshu.card.server.core.domain.base.SuperMain;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import org.springframework.data.mongodb.core.mapping.DBRef;
 import org.springframework.data.mongodb.core.mapping.Document;
 
 /**
@@ -26,7 +28,22 @@ public class DeviceInfo extends SuperMain {
     @Schema(description = "设备名称")
     private String deviceName;
 
-    @Schema(description = "设备类型")
+    @Schema(description = "设备编号")
+    private String code;
+
+    @Schema(description = "设备类型,如 消费机 门禁机")
     private DeviceType deviceType;
 
+    @Schema(description = "网关号")
+    private String gateWayCode;
+
+    @Schema(description = "所属区域")
+    @DBRef(lazy = true)
+    private Area area;
+
+    @Schema(description = "是否在线")
+    private OnLineState onLineState = OnLineState.OnLine;
+
+    @Schema(description = "设备IP地址")
+    private String ip;
 }

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

@@ -93,6 +93,9 @@ public abstract class SuperService {
     public void initDefaultUserAndOid(SuperParam param) {
         initDefaultUserParam(param);
         initOid(param);
+        if (param.getId() != null && param.getId().trim().equals("")) {
+            param.setId(null);
+        }
     }
 
     public void initDefaultUserParam(SuperParam param) {

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

@@ -0,0 +1,149 @@
+package com.zhongshu.card.server.core.service.school;
+
+import com.github.microservice.components.data.base.util.PageEntityUtil;
+import com.zhongshu.card.client.model.school.*;
+import com.zhongshu.card.client.ret.ResultContent;
+import com.zhongshu.card.client.ret.ResultMessage;
+import com.zhongshu.card.client.service.school.DeviceInfoService;
+import com.zhongshu.card.server.core.dao.school.AreaDao;
+import com.zhongshu.card.server.core.dao.school.DeviceInfoDao;
+import com.zhongshu.card.server.core.domain.school.Area;
+import com.zhongshu.card.server.core.domain.school.BookInfo;
+import com.zhongshu.card.server.core.domain.school.DeviceInfo;
+import com.zhongshu.card.server.core.service.base.SuperService;
+import com.zhongshu.card.server.core.util.BeanUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.stereotype.Service;
+import org.springframework.util.Assert;
+
+/**
+ * @author TRX
+ * @date 2024/6/14
+ */
+@Slf4j
+@Service
+public class DeviceInfoServiceImpl extends SuperService implements DeviceInfoService {
+
+    @Autowired
+    DeviceInfoDao deviceInfoDao;
+
+    @Autowired
+    AreaServiceImpl areaService;
+
+    @Autowired
+    AreaDao areaDao;
+
+    /**
+     * 添加-编辑设备
+     *
+     * @param param
+     * @return
+     */
+    @Override
+    public ResultContent addDeviceInfo(DeviceInfoParam param) {
+        initDefaultUserAndOid(param);
+        Assert.hasText(param.getCode(), "code不能为空");
+
+        String oid = param.getOid();
+        DeviceInfo deviceInfo = null;
+        if (StringUtils.isNotEmpty(param.getId())) {
+            deviceInfo = deviceInfoDao.findTopById(param.getId());
+            if (ObjectUtils.isEmpty(deviceInfo)) {
+                return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, param.getId()));
+            }
+            DeviceInfo temp = deviceInfoDao.findTopByCodeAndOid(param.getCode(), oid);
+            if (ObjectUtils.isNotEmpty(temp) && !temp.getId().equals(deviceInfo.getId())) {
+                return ResultContent.buildFail(String.format("设备号已存在:%s", param.getCode()));
+            }
+        } else {
+            deviceInfo = new DeviceInfo();
+            DeviceInfo temp = deviceInfoDao.findTopByCodeAndOid(param.getCode(), oid);
+            if (ObjectUtils.isNotEmpty(temp)) {
+                return ResultContent.buildFail(String.format("设备号已存在:%s", param.getCode()));
+            }
+        }
+        BeanUtils.copyProperties(param, deviceInfo);
+        Area area = null;
+        if (StringUtils.isNotEmpty(param.getAreaId())) {
+            area = areaDao.findTopById(param.getAreaId());
+            if (ObjectUtils.isEmpty(area)) {
+                return ResultContent.buildFail(String.format("区域ID不存在:%s", param.getAreaId()));
+            }
+        }
+        deviceInfo.setArea(area);
+        deviceInfoDao.save(deviceInfo);
+        return ResultContent.buildSuccess();
+    }
+
+    /**
+     * 设备分页列表
+     *
+     * @param param
+     * @param pageable
+     * @return
+     */
+    @Override
+    public ResultContent<Page<DeviceInfoModel>> page(DeviceInfoSearch param, Pageable pageable) {
+        initOidSearchParam(param);
+        Page<DeviceInfo> page = deviceInfoDao.page(pageable, param);
+        return ResultContent.buildSuccess(PageEntityUtil.concurrent2PageModel(page, this::toModel));
+    }
+
+    /**
+     * 删除设备
+     *
+     * @param id
+     * @return
+     */
+    @Override
+    public ResultContent deleteDeviceInfo(String id) {
+        DeviceInfo deviceInfo = deviceInfoDao.findTopById(id);
+        if (ObjectUtils.isEmpty(deviceInfo)) {
+            return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, id));
+        }
+        deviceInfoDao.delete(deviceInfo);
+        return ResultContent.buildSuccess();
+    }
+
+    /**
+     * 得到设备详情
+     *
+     * @param id
+     * @return
+     */
+    @Override
+    public ResultContent<DeviceInfoMoreModel> getDeviceDetail(String id) {
+        DeviceInfo deviceInfo = deviceInfoDao.findTopById(id);
+        if (ObjectUtils.isEmpty(deviceInfo)) {
+            return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, id));
+        }
+        DeviceInfoMoreModel model = toMoreModel(deviceInfo);
+        return ResultContent.buildSuccess(model);
+    }
+
+    public DeviceInfoMoreModel toMoreModel(DeviceInfo entity) {
+        DeviceInfoMoreModel model = null;
+        if (ObjectUtils.isEmpty(entity)) {
+            model = new DeviceInfoMoreModel();
+            BeanUtils.copyProperties(entity, model);
+            model.setArea(areaService.toModel(entity.getArea()));
+        }
+        return model;
+    }
+
+    public DeviceInfoModel toModel(DeviceInfo entity) {
+        DeviceInfoModel model = null;
+        if (ObjectUtils.isEmpty(entity)) {
+            model = new DeviceInfoModel();
+            BeanUtils.copyProperties(entity, model);
+            model.setArea(areaService.toModel(entity.getArea()));
+        }
+        return model;
+    }
+
+}

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

@@ -209,6 +209,7 @@ public class SchoolUserServiceImpl extends SuperService implements SchoolUserSer
             }
             map.put("code", cardInfo.getCode());
         }
+
         ResultContent resultContent = userAccountService.update(param);
         if (resultContent.isFailed()) {
             return resultContent;
@@ -217,6 +218,7 @@ public class SchoolUserServiceImpl extends SuperService implements SchoolUserSer
         // 维护卡片信息
         String userId = organizationUser.getUserId();
         String oid = organizationUser.getOid();
+        // 删除所有卡片
         cardInfoDao.deleteByUserIdAndOid(userId, oid);
         for (CardInfoParam cardInfo : cardInfos) {
             cardInfo.setUserId(userId);