TRX 1 년 전
부모
커밋
e58cc4c72c

+ 30 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/org/OidAboutInfo.java

@@ -0,0 +1,30 @@
+package com.zhongshu.card.client.model.org;
+
+import com.github.microservice.auth.security.type.AuthType;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.internal.build.AllowPrintStacktrace;
+
+/**
+ * @author TRX
+ * @date 2024/7/30
+ */
+@Data
+@AllowPrintStacktrace
+@NoArgsConstructor
+public class OidAboutInfo {
+
+    @Schema(description = "传入的oid")
+    private String oid;
+
+    @Schema(description = "传入的oid类型")
+    private AuthType authType;
+
+    @Schema(description = "项目oid")
+    private String projectOid;
+    @Schema(description = "学校oid")
+    private String schoolOid;
+    @Schema(description = "商户oid")
+    private String shopOid;
+}

+ 33 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/school/CardInfoPoolImportParam.java

@@ -0,0 +1,33 @@
+package com.zhongshu.card.client.model.school;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import com.zhongshu.card.client.utils.type.school.CardType;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author TRX
+ * @date 2024/7/30
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CardInfoPoolImportParam {
+
+    @Excel(name = "卡号")
+    @Schema(description = "卡片号码,唯一标识, 卡号")
+    private String code;
+
+    @Excel(name = "名称")
+    @Schema(description = "卡片名称")
+    private String name;
+
+    @Schema(description = "卡片类型")
+    private String cardType;
+
+    @Excel(name = "uid")
+    @Schema(description = "uid是什么")
+    private String uid;
+}

+ 6 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/school/CardInfoPoolSearch.java

@@ -32,4 +32,10 @@ public class CardInfoPoolSearch extends SuperSearch {
 
     @Schema(description = "关键字")
     private String keyWord;
+
+    @Schema(description = "项目Oid")
+    private String projectOid;
+
+    @Schema(description = "学校oid")
+    private String schoolOid;
 }

+ 3 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/service/org/OrganizationService.java

@@ -68,6 +68,9 @@ public interface OrganizationService {
     // 删除机构信息
     public ResultContent deleteOrganization(String oid);
 
+    // 得到oid关联的结构信息
+    OidAboutInfo getOidAboutProjectInfo(String oid);
+
     public ResultContent<List<OrganizationSimpleModel>> list(OrganizationSearchParam param);
 
     public ResultContent<Page<OrganizationModel>> page(OrganizationSearchParam param, Pageable pageable);

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

@@ -13,12 +13,17 @@ import com.zhongshu.card.server.core.service.school.CardInfoPoolService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 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.http.MediaType;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
 import java.util.List;
 
 /**
@@ -79,5 +84,16 @@ public class CardInfoPoolController {
         return cardInfoPoolService.deleteCardInfoPool(param.getId());
     }
 
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @RequestMapping(value = "importCardPool", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, method = RequestMethod.POST)
+    @Operation(summary = "园区卡池导入", description = "园区卡池导入")
+    public ResultContent<ImportUserModel> importCardPool(HttpServletRequest request,
+            HttpServletResponse response,
+            @RequestPart("file") MultipartFile file) throws IOException {
+        if (file == null || file.isEmpty()) {
+            return ResultContent.buildFail("文件不能为空");
+        }
+        return cardInfoPoolService.importCardPool(request, response, file);
+    }
 
 }

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

@@ -22,4 +22,6 @@ public interface CardInfoPoolDao extends MongoDao<CardInfoPool>, CardInfoPoolDao
     CardInfoPool findTopByCodeAndOid(String code, String oid);
 
     CardInfoPool findTopByCodeAndProjectOid(String code, String projectOid);
+
+    boolean existsByCodeAndProjectOid(String code, String projectOid);
 }

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

@@ -44,6 +44,14 @@ public class CardInfoPoolDaoImpl extends BaseImpl implements CardInfoPoolDaoExte
             criteria.and("oid").is(param.getOid());
         }
 
+        if (ObjectUtils.isNotEmpty(param.getProjectOid())) {
+            criteria.and("projectOid").is(param.getProjectOid());
+        }
+
+        if (ObjectUtils.isNotEmpty(param.getSchoolOid())) {
+            criteria.and("schoolOid").is(param.getSchoolOid());
+        }
+
         if (param.getCardType() != null) {
             criteria.and("cardType").is(param.getCardType());
         }

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

@@ -2,6 +2,7 @@ package com.zhongshu.card.server.core.domain.school;
 
 import com.github.microservice.components.data.mongo.mongo.domain.SuperEntity;
 import com.zhongshu.card.client.utils.type.school.CardType;
+import com.zhongshu.card.server.core.domain.base.SuperMain;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -20,7 +21,8 @@ import org.springframework.data.mongodb.core.mapping.Document;
 @AllArgsConstructor
 @NoArgsConstructor
 @NonLeaked
-public class CardInfoPool extends SuperEntity {
+public class CardInfoPool extends SuperMain {
+
     @Schema(description = "卡片名称")
     private String name;
 
@@ -44,4 +46,7 @@ public class CardInfoPool extends SuperEntity {
 
     @Schema(description = "项目Oid")
     private String projectOid;
+
+    @Schema(description = "学校oid")
+    private String schoolOid;
 }

+ 60 - 2
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/org/OrganizationServiceImpl.java

@@ -24,6 +24,7 @@ import com.zhongshu.card.server.core.domain.org.*;
 import com.zhongshu.card.server.core.service.base.SuperService;
 import com.zhongshu.card.server.core.service.sync.ProjectSyncIotCenterService;
 import com.zhongshu.card.server.core.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -304,8 +305,7 @@ public class OrganizationServiceImpl extends SuperService implements Organizatio
     public OrganizationRelation getSchoolRelationProject(String schoolOid) {
         Organization schoolOrg = organizationDao.findTopByOid(schoolOid);
         if (ObjectUtils.isNotEmpty(schoolOrg)) {
-            OrganizationRelation organizationRelation = organizationRelationDao.findTopByMainOrganizationAndRelationType(
-                    schoolOrg, OrganizationRelationType.SchoolToProject);
+            OrganizationRelation organizationRelation = organizationRelationDao.findTopByMainOrganizationAndRelationType(schoolOrg, OrganizationRelationType.SchoolToProject);
             return organizationRelation;
         }
         return null;
@@ -452,6 +452,64 @@ public class OrganizationServiceImpl extends SuperService implements Organizatio
         return ResultContent.buildSuccess(model);
     }
 
+    /**
+     * 得到oid对应的关联oid信息
+     *
+     * @param oid
+     * @return
+     */
+    public OidAboutInfo getOidAboutProjectInfo(String oid) {
+        OidAboutInfo aboutInfo = new OidAboutInfo();
+        if (StringUtils.isNotEmpty(oid)) {
+            aboutInfo.setOid(oid);
+
+            String projectOid = "";
+            String schoolOid = "";
+            String shopOid = "";
+
+            Organization organization = organizationDao.findTopByOid(oid);
+            if (ObjectUtils.isNotEmpty(organization)) {
+                AuthType authType = organization.getAuthType();
+                aboutInfo.setAuthType(authType);
+                if (authType == AuthType.Project) {
+                    // 项目
+                    projectOid = oid;
+                } else if (authType == AuthType.School) {
+                    // 如果是学校
+                    ResultContent<ProjectOrgModel> projectContent = getSchoolProjectDetail(oid);
+                    schoolOid = oid;
+                    // 查询出项目的oid
+                    if (projectContent.isSuccess()) {
+                        projectOid = projectContent.getContent().getOid();
+                    }
+                } else if (authType == AuthType.BusinessMain) {
+                    // 属于商户
+                    shopOid = oid;
+                    // 商户绑定的学校信息
+                    OrganizationRelation relation = organizationRelationDao.findTopByMainOrganizationAndRelationType(
+                            organization, OrganizationRelationType.ShopToSchool);
+                    if (ObjectUtils.isNotEmpty(relation)) {
+                        Organization schoolOrg = relation.getRelOrganization();
+                        if (ObjectUtils.isNotEmpty(schoolOrg)) {
+                            schoolOid = schoolOrg.getOid();
+
+                            // 学校绑定的项目信息
+                            ResultContent<ProjectOrgModel> projectContent = getSchoolProjectDetail(oid);
+                            // 查询出项目的oid
+                            if (projectContent.isSuccess()) {
+                                projectOid = projectContent.getContent().getOid();
+                            }
+                        }
+                    }
+                }
+                aboutInfo.setProjectOid(projectOid);
+                aboutInfo.setSchoolOid(schoolOid);
+                aboutInfo.setShopOid(shopOid);
+            }
+        }
+        return aboutInfo;
+    }
+
     /**
      * 分页数据
      *

+ 99 - 8
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/school/CardInfoPoolService.java

@@ -1,16 +1,25 @@
 package com.zhongshu.card.server.core.service.school;
 
+import cn.afterturn.easypoi.excel.ExcelImportUtil;
+import cn.afterturn.easypoi.excel.entity.ImportParams;
+import com.github.microservice.auth.security.type.AuthType;
 import com.github.microservice.components.data.base.util.PageEntityUtil;
+import com.zhongshu.card.client.model.org.OidAboutInfo;
 import com.zhongshu.card.client.model.org.ProjectOrgModel;
 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.utils.type.school.CardType;
+import com.zhongshu.card.server.core.dao.org.OrganizationDao;
 import com.zhongshu.card.server.core.dao.school.CardInfoPoolDao;
+import com.zhongshu.card.server.core.domain.org.Organization;
 import com.zhongshu.card.server.core.domain.school.CardInfoPool;
-import com.zhongshu.card.server.core.domain.school.DeviceBind;
 import com.zhongshu.card.server.core.service.base.SuperService;
 import com.zhongshu.card.server.core.service.org.OrganizationServiceImpl;
 import com.zhongshu.card.server.core.util.BeanUtils;
+import com.zhongshu.card.server.core.util.CommonUtil;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -18,6 +27,11 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
+import org.springframework.util.Assert;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * @author TRX
@@ -33,6 +47,9 @@ public class CardInfoPoolService extends SuperService {
     @Autowired
     OrganizationServiceImpl organizationService;
 
+    @Autowired
+    OrganizationDao organizationDao;
+
     /**
      * 保存卡片信息
      *
@@ -44,14 +61,14 @@ public class CardInfoPoolService extends SuperService {
         CardInfoPool entity = null;
         // 这是学校的oid
         String oid = param.getOid();
-        ResultContent<ProjectOrgModel> projectContent = organizationService.getSchoolProjectDetail(oid);
-        // 查询出项目的oid
-        String projectOid = "";
-        if (projectContent.isSuccess()) {
-            projectOid = projectContent.getContent().getOid();
-        }
+
+        OidAboutInfo oidAboutInfo = organizationService.getOidAboutProjectInfo(oid);
+
+        String projectOid = oidAboutInfo.getProjectOid();
+        String schoolOid = oidAboutInfo.getSchoolOid();
+
         // 学校唯一
-        CardInfoPool temp = cardInfoPoolDao.findTopByCodeAndOid(param.getCode(), oid);
+        CardInfoPool temp = cardInfoPoolDao.findTopByCodeAndProjectOid(param.getCode(), projectOid);
         if (StringUtils.isNotEmpty(param.getId())) {
             entity = cardInfoPoolDao.findTopById(param.getId());
             if (ObjectUtils.isEmpty(entity)) {
@@ -68,6 +85,7 @@ public class CardInfoPoolService extends SuperService {
         }
         BeanUtils.copyProperties(param, entity);
         entity.setProjectOid(projectOid);
+        entity.setSchoolOid(schoolOid);
         if (entity.getIsUsed() == null) {
             entity.setIsUsed(Boolean.FALSE);
         }
@@ -133,6 +151,79 @@ public class CardInfoPoolService extends SuperService {
         return ResultContent.buildSuccess();
     }
 
+    /**
+     * 导入 学校卡片excel
+     *
+     * @param request
+     * @param response
+     * @param file
+     * @return
+     */
+    public ResultContent<ImportUserModel> importCardPool(HttpServletRequest request,
+            HttpServletResponse response, MultipartFile file) {
+        String oid = getCurrentOid();
+        Assert.hasText(oid, "oid不能为空");
+
+        OidAboutInfo oidAboutInfo = organizationService.getOidAboutProjectInfo(oid);
+
+        String projectOid = oidAboutInfo.getProjectOid();
+        String schoolOid = oidAboutInfo.getSchoolOid();
+
+        ImportUserModel model = new ImportUserModel();
+        try {
+            int startRow = 2;
+            ImportParams params = new ImportParams();
+            List<CardInfoPoolImportParam> list = ExcelImportUtil.importExcel(file.getInputStream(),
+                    CardInfoPoolImportParam.class, params);
+            model.setTotal(list.size());
+
+            List<String> failDetails = new ArrayList<>();
+            List<CardInfoPool> cardInfoPools = new ArrayList<>();
+            if (ObjectUtils.isNotEmpty(list)) {
+                for (CardInfoPoolImportParam param1 : list) {
+                    // 验证数据合法性
+                    boolean b = true;
+                    if (b && StringUtils.isEmpty(param1.getCode())) {
+                        b = false;
+                        failDetails.add(String.format("第%d行卡号不能为空", startRow));
+                    }
+                    if (b && StringUtils.isEmpty(param1.getCardType())) {
+                        b = false;
+                        failDetails.add(String.format("第%d行卡片类型不能为空", startRow));
+                    }
+
+                    if (b) {
+                        // 检查是否已存在 code
+                        boolean exit = cardInfoPoolDao.existsByCodeAndProjectOid(param1.getCode(), projectOid);
+                        if (exit) {
+                            b = false;
+                        }
+                    }
+
+                    if (b) {
+                        // 验证通过
+                        CardInfoPool pool = new CardInfoPool();
+                        initEntity(pool);
+                        BeanUtils.copyProperties(param1, pool, "cardType");
+                        pool.setSchoolOid(schoolOid);
+                        pool.setProjectOid(projectOid);
+                        pool.setIsUsed(Boolean.FALSE);
+                        CardType cardType = CommonUtil.getCardTypeByStr(param1.getCardType());
+                        pool.setCardType(cardType);
+                        cardInfoPools.add(pool);
+                    }
+                    startRow++;
+                }
+                cardInfoPoolDao.saveAll(cardInfoPools);
+                model.setSuccess(cardInfoPools.size());
+                model.setFailDetails(failDetails);
+            }
+        } catch (Exception e) {
+            return ResultContent.buildFail(String.format("导入出错:%s", e.getMessage()));
+        }
+        return ResultContent.buildSuccess(model);
+    }
+
     public CardInfoPoolModel toModel(CardInfoPool entity) {
         CardInfoPoolModel model = null;
         if (ObjectUtils.isNotEmpty(entity)) {

+ 13 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/util/CommonUtil.java

@@ -8,6 +8,7 @@ import com.google.zxing.qrcode.QRCodeWriter;
 import com.zhongshu.card.client.utils.ITree;
 import com.zhongshu.card.client.utils.type.DataState;
 import com.zhongshu.card.client.utils.type.Sex;
+import com.zhongshu.card.client.utils.type.school.CardType;
 import com.zhongshu.card.server.core.domain.base.SuperMain;
 import com.zhongshu.card.server.core.util.exception.BusinessException;
 import lombok.SneakyThrows;
@@ -483,6 +484,18 @@ public class CommonUtil {
         return null;
     }
 
+    public static CardType getCardTypeByStr(String str) {
+        if (StringUtils.isNotEmpty(str)) {
+            str = str.trim();
+            for (CardType sex : CardType.values()) {
+                if (sex.getRemark().equals(str)) {
+                    return sex;
+                }
+            }
+        }
+        return null;
+    }
+
     /**
      * 月份搜索的时候转换
      *