Ver Fonte

学校功能

TRX há 1 ano atrás
pai
commit
cb7a1762cd
16 ficheiros alterados com 450 adições e 23 exclusões
  1. 12 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/org/OrganizationUserSearch.java
  2. 13 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/org/UserCountAddParam.java
  3. 37 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/school/ExcelUserParam.java
  4. 36 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/school/ImportUserModel.java
  5. 21 0
      FullCardClient/src/main/java/com/zhongshu/card/client/service/school/SchoolUserService.java
  6. 19 0
      FullCardClient/src/main/java/com/zhongshu/card/client/utils/type/CertificateType.java
  7. 1 1
      FullCardClient/src/main/java/com/zhongshu/card/client/utils/type/UserState.java
  8. 4 8
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/org/UserInfoController.java
  9. 59 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/school/SchoolUserController.java
  10. 5 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/impl/OrganizationUserDaoImpl.java
  11. 22 4
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/org/OrganizationUser.java
  12. 3 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/org/Region.java
  13. 7 4
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/org/UserAccount.java
  14. 21 6
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/org/UserAccountServiceImpl.java
  15. 176 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/school/SchoolUserServiceImpl.java
  16. 14 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/util/CommonUtil.java

+ 12 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/org/OrganizationUserSearch.java

@@ -7,6 +7,8 @@ import com.zhongshu.card.client.utils.type.UserState;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import java.util.List;
+
 /**
  * @author TRX
  * @date 2024/5/31
@@ -40,4 +42,14 @@ public class OrganizationUserSearch extends SuperSearch {
 
     @Schema(description = "用户在机构的类型")
     private OrganizationUserType userType;
+
+    @Schema(description = "职位ID")
+    private String positionId;
+
+    @Schema(description = "部门ID结合")
+    private List<String> departmentIds;
+
+    @Schema(description = "角色ID集合")
+    private List<String> roleIds;
+
 }

+ 13 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/org/UserCountAddParam.java

@@ -1,6 +1,7 @@
 package com.zhongshu.card.client.model.org;
 
 import com.zhongshu.card.client.model.base.SuperParam;
+import com.zhongshu.card.client.utils.type.OrganizationUserType;
 import com.zhongshu.card.client.utils.type.Sex;
 import com.zhongshu.card.client.utils.type.UserState;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -30,6 +31,18 @@ public class UserCountAddParam extends SuperParam {
     @Schema(description = "地址")
     private String address;
 
+    @Schema(description = "证件号码")
+    private String cardNumber;
+
+    @Schema(description = "职位")
+    private String positionId;
+
+    @Schema(description = "人脸照片")
+    private List<String> faceImages;
+
+    @Schema(description = "用户在机构的类型")
+    private OrganizationUserType userType = OrganizationUserType.Teacher;
+
     @Schema(description = "用户状态")
     UserState state = UserState.Normal;
 

+ 37 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/school/ExcelUserParam.java

@@ -0,0 +1,37 @@
+package com.zhongshu.card.client.model.school;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 校园 excel导入用户的模型
+ *
+ * @author TRX
+ * @date 2024/6/12
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ExcelUserParam {
+    @Excel(name = "姓名")
+    private String name;
+
+    @Excel(name = "性别")
+    private String sexStr;
+
+    @Excel(name = "人员编号")
+    private String code;
+
+    @Excel(name = "证件号码")
+    private String cardNumber;
+
+    @Excel(name = "用户手机号")
+    private String phone;
+
+    @Excel(name = "备注")
+    private String remark;
+
+}

+ 36 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/school/ImportUserModel.java

@@ -0,0 +1,36 @@
+package com.zhongshu.card.client.model.school;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @author TRX
+ * @date 2024/6/12
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ImportUserModel {
+    @Schema(description = "导入总条数")
+    private Integer total;
+
+    @Schema(description = "成功导入条数")
+    private Integer success;
+
+    @Schema(description = "导入失败条数")
+    private Integer fail;
+
+    public Integer getFail() {
+        if (fail == null && total != null && success != null) {
+            return total - success;
+        }
+        return fail;
+    }
+
+    @Schema(description = "失败详情")
+    private List<String> failDetails;
+}

+ 21 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/service/school/SchoolUserService.java

@@ -0,0 +1,21 @@
+package com.zhongshu.card.client.service.school;
+
+import com.zhongshu.card.client.model.org.OrganizationUserSearch;
+import com.zhongshu.card.client.model.school.ImportUserModel;
+import com.zhongshu.card.client.ret.ResultContent;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * @author TRX
+ * @date 2024/6/12
+ */
+public interface SchoolUserService {
+
+    ResultContent<ImportUserModel> importSchoolUsers(HttpServletRequest request,
+            HttpServletResponse response, MultipartFile file);
+
+    void exportSchoolUser(HttpServletRequest request, HttpServletResponse response,
+            OrganizationUserSearch param);
+}

+ 19 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/utils/type/CertificateType.java

@@ -0,0 +1,19 @@
+package com.zhongshu.card.client.utils.type;
+
+import lombok.Getter;
+
+/**
+ * 证件类型
+ */
+public enum CertificateType {
+    IDCard("身份证"),
+    Passport("护照"),
+    ;
+
+    @Getter
+    private String remark;
+
+    CertificateType(String remark) {
+        this.remark = remark;
+    }
+}

+ 1 - 1
FullCardClient/src/main/java/com/zhongshu/card/client/utils/type/UserState.java

@@ -8,7 +8,7 @@ import lombok.Getter;
 public enum UserState {
 
     Normal("正常"),
-    Locked("锁定"),
+    Locked("禁用"),
     ;
 
     @Getter

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

@@ -1,25 +1,21 @@
 package com.zhongshu.card.server.core.controller.org;
 
-import com.github.microservice.auth.client.model.LoginTokenModel;
 import com.github.microservice.auth.security.annotations.ResourceAuth;
 import com.github.microservice.auth.security.helper.AuthHelper;
 import com.github.microservice.auth.security.type.AuthType;
 import com.zhongshu.card.client.model.base.AuthTypeParam;
-import com.zhongshu.card.client.model.base.UserIdModel;
-import com.zhongshu.card.client.model.org.*;
+import com.zhongshu.card.client.model.org.OrganizationModel;
+import com.zhongshu.card.client.model.org.OrganizationUserSearch;
+import com.zhongshu.card.client.model.org.PassWordModel;
+import com.zhongshu.card.client.model.org.UserCountDetailsModel;
 import com.zhongshu.card.client.ret.ResultContent;
-import com.zhongshu.card.client.ret.ResultState;
 import com.zhongshu.card.client.service.org.OrganizationService;
 import com.zhongshu.card.client.service.org.UserAccountService;
 import com.zhongshu.card.client.utils.type.UserState;
 import com.zhongshu.card.server.core.service.org.IndexService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
-import jakarta.servlet.http.Cookie;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;

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

@@ -0,0 +1,59 @@
+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.org.OrganizationUserSearch;
+import com.zhongshu.card.client.model.school.ImportUserModel;
+import com.zhongshu.card.client.ret.ResultContent;
+import com.zhongshu.card.client.service.school.SchoolUserService;
+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.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+
+/**
+ * @author TRX
+ * @date 2024/6/12
+ */
+@RestController
+@RequestMapping("/school/schoolUser")
+@Tag(name = "学校-用户管理")
+public class SchoolUserController {
+
+    @Autowired
+    SchoolUserService schoolUserService;
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @RequestMapping(value = "importSchoolUsers", method = RequestMethod.POST)
+    @Operation(summary = "导入校园用户", description = "导入校园用户")
+    public ResultContent<ImportUserModel> importSchoolUsers(HttpServletRequest request,
+            HttpServletResponse response,
+            @Parameter(name = "file") @RequestParam("file") MultipartFile file) throws IOException {
+        if (file == null || file.isEmpty()) {
+            return ResultContent.buildFail("文件不能为空");
+        }
+        return schoolUserService.importSchoolUsers(request, response, file);
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @RequestMapping(value = "exportSchoolUser", method = RequestMethod.POST)
+    @Operation(summary = "导出校园用户", description = "导出校园用户")
+    public void exportSchoolUser(HttpServletRequest request,
+            HttpServletResponse response,
+            OrganizationUserSearch param) throws IOException {
+        schoolUserService.exportSchoolUser(request, response, param);
+    }
+
+}

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

@@ -63,6 +63,11 @@ public class OrganizationUserDaoImpl extends BaseImpl implements OrganizationUse
             criteria.and("isAdmin").is(param.getIsAdmin());
         }
 
+        // 职位
+        if (StringUtils.isNotEmpty(param.getPositionId())) {
+            criteria.and("position.id").is(param.getPositionId());
+        }
+
         if (!CommonUtil.longIsEmpty(param.getStartTime()) && !CommonUtil.longIsEmpty(param.getEndTime())) {
             criteria.and("createTime").gte(param.getStartTime()).and("createTime").lte(param.getEndTime());
         }

+ 22 - 4
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/org/OrganizationUser.java

@@ -1,9 +1,11 @@
 package com.zhongshu.card.server.core.domain.org;
 
 import com.github.microservice.auth.security.type.AuthType;
+import com.zhongshu.card.client.utils.type.CertificateType;
 import com.zhongshu.card.client.utils.type.OrganizationUserType;
 import com.zhongshu.card.client.utils.type.UserState;
 import com.zhongshu.card.server.core.domain.base.SuperMain;
+import com.zhongshu.card.server.core.domain.school.DictInfo;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 import org.springframework.data.mongodb.core.index.CompoundIndex;
@@ -40,10 +42,11 @@ public class OrganizationUser extends SuperMain {
     @DBRef(lazy = true)
     private UserAccount user;
 
+    //---------------------------用户基础信息 start ----------------------
     @Schema(description = "用户ID")
     private String userId;
 
-    @Schema(description = "工号")
+    @Schema(description = "工号、编码")
     @Indexed
     private String code;
 
@@ -55,6 +58,23 @@ public class OrganizationUser extends SuperMain {
     @Indexed
     private String name;
 
+    @Schema(description = "用户在机构的类型 学生 老师")
+    private OrganizationUserType userType;
+
+    @Schema(description = "证件类型")
+    private CertificateType certificateType = CertificateType.IDCard;
+
+    @Schema(description = "证件号码")
+    private String cardNumber;
+
+    @Schema(description = "职位")
+    private DictInfo position;
+
+    @Schema(description = "人脸照片")
+    private List<String> faceImages;
+
+    //---------------------------用户基础信息 end ------------------------
+
     @Schema(description = "用户状态")
     private UserState state = UserState.Normal;
 
@@ -64,9 +84,6 @@ public class OrganizationUser extends SuperMain {
     @Schema(description = "机构类型")
     private AuthType authType = AuthType.Enterprise;
 
-    @Schema(description = "用户在机构的类型")
-    private OrganizationUserType userType;
-
     @Schema(description = "角色信息")
     @DBRef(lazy = true)
     private List<Role> roles = new ArrayList<>();
@@ -74,4 +91,5 @@ public class OrganizationUser extends SuperMain {
     @Schema(description = "部门信息")
     @DBRef(lazy = true)
     private List<Department> departments = new ArrayList<>();
+
 }

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

@@ -7,6 +7,9 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.springframework.data.mongodb.core.mapping.Document;
 
+/**
+ * 地区信息
+ */
 @Data
 @Builder
 @Document

+ 7 - 4
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/org/UserAccount.java

@@ -1,9 +1,6 @@
 package com.zhongshu.card.server.core.domain.org;
 
-import com.zhongshu.card.client.utils.type.Sex;
-import com.zhongshu.card.client.utils.type.UserLoginType;
-import com.zhongshu.card.client.utils.type.UserState;
-import com.zhongshu.card.client.utils.type.UserType;
+import com.zhongshu.card.client.utils.type.*;
 import com.zhongshu.card.server.core.domain.base.SuperMain;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
@@ -52,6 +49,12 @@ public class UserAccount extends SuperMain {
     @Schema(description = "地址")
     private String address;
 
+    @Schema(description = "证件类型")
+    private CertificateType certificateType = CertificateType.IDCard;
+
+    @Schema(description = "证件号码")
+    private String cardNumber;
+
     @Schema(description = "用户状态")
     UserState state = UserState.Normal;
 

+ 21 - 6
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/org/UserAccountServiceImpl.java

@@ -16,8 +16,10 @@ import com.zhongshu.card.client.service.org.OrganizationService;
 import com.zhongshu.card.client.service.org.UserAccountService;
 import com.zhongshu.card.client.utils.type.*;
 import com.zhongshu.card.server.core.dao.org.*;
+import com.zhongshu.card.server.core.dao.school.DictInfoDao;
 import com.zhongshu.card.server.core.dataConfig.CardDefault;
 import com.zhongshu.card.server.core.domain.org.*;
+import com.zhongshu.card.server.core.domain.school.DictInfo;
 import com.zhongshu.card.server.core.service.base.SuperService;
 import com.zhongshu.card.server.core.util.BeanUtils;
 import com.zhongshu.card.server.core.util.CommonUtil;
@@ -76,8 +78,11 @@ public class UserAccountServiceImpl extends SuperService implements UserAccountS
     @Autowired
     DepartmentServiceImpl departmentService;
 
+    @Autowired
+    DictInfoDao dictInfoDao;
+
     /**
-     * 添加编辑用户
+     * 添加编辑用户 添加机构用户
      *
      * @param param
      * @return
@@ -94,6 +99,7 @@ public class UserAccountServiceImpl extends SuperService implements UserAccountS
         if (param.getState() == null) {
             param.setState(UserState.Normal);
         }
+
         // 机构信息
         Organization organization = organizationDao.findTopByOid(oid);
         if (ObjectUtils.isEmpty(organization)) {
@@ -107,9 +113,11 @@ public class UserAccountServiceImpl extends SuperService implements UserAccountS
         if (ObjectUtils.isNotEmpty(param.getDepartmentIds())) {
             departments = departmentDao.findByOidAndIdIn(oid, param.getDepartmentIds());
         }
+
         UserAccount temp = null;
         String loginName = param.getPhone();
         String userId = "";
+        // 这的ID是 用户和机构关系数据ID
         if (StringUtils.isEmpty(param.getId())) {
             // 添加
             // 判断用户是否存在
@@ -127,6 +135,7 @@ public class UserAccountServiceImpl extends SuperService implements UserAccountS
                 }
                 temp = new UserAccount();
                 BeanUtils.copyProperties(param, temp);
+
                 userId = addModelResult.getContent();
                 temp.setUserId(userId);
                 temp.setUserType(UserType.Consumer);
@@ -138,10 +147,12 @@ public class UserAccountServiceImpl extends SuperService implements UserAccountS
                 userCountDao.save(temp);
             }
         } else {
-            temp = userCountDao.findTopById(param.getId());
-            if (ObjectUtils.isEmpty(temp)) {
+            OrganizationUser organizationUser = organizationUserDao.findTopById(param.getId());
+            if (ObjectUtils.isEmpty(organizationUser)) {
                 return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, param.getId()));
             }
+            temp = organizationUser.getUser();
+            // 用户信息
             BeanUtils.copyProperties(param, temp);
             temp.setSpellCode(CommonUtil.getPinyin(param.getName()));
             userCountDao.save(temp);
@@ -155,6 +166,7 @@ public class UserAccountServiceImpl extends SuperService implements UserAccountS
         if (ObjectUtils.isEmpty(organizationUser)) {
             // 不在机构中
             organizationUser = new OrganizationUser();
+            organizationUser.setOid(organization.getOid());
             organizationUser.setOrganization(organization);
             organizationUser.setUser(temp);
             organizationUser.setUserId(temp.getUserId());
@@ -175,9 +187,12 @@ public class UserAccountServiceImpl extends SuperService implements UserAccountS
                 }
             }
         }
-        organizationUser.setPhone(temp.getPhone());
-        organizationUser.setName(temp.getName());
-        organizationUser.setState(temp.getState());
+
+        BeanUtils.copyProperties(param, temp, "id", "oid");
+        // 职位信息
+        if (StringUtils.isNotEmpty(param.getPositionId())) {
+            organizationUser.setPosition(dictInfoDao.findTopById(param.getPositionId()));
+        }
         organizationUser.setRoles(roles);
         organizationUser.setDepartments(departments);
         organizationUserDao.save(organizationUser);

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

@@ -0,0 +1,176 @@
+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.core.util.bean.BeanUtil;
+import com.zhongshu.card.client.model.org.OrganizationUserSearch;
+import com.zhongshu.card.client.model.org.UserCountAddParam;
+import com.zhongshu.card.client.model.school.ExcelUserParam;
+import com.zhongshu.card.client.model.school.ImportUserModel;
+import com.zhongshu.card.client.ret.ResultContent;
+import com.zhongshu.card.client.service.org.UserAccountService;
+import com.zhongshu.card.client.service.school.SchoolUserService;
+import com.zhongshu.card.client.utils.type.Sex;
+import com.zhongshu.card.server.core.dao.org.OrganizationDao;
+import com.zhongshu.card.server.core.dao.org.OrganizationUserDao;
+import com.zhongshu.card.server.core.domain.org.Organization;
+import com.zhongshu.card.server.core.domain.org.OrganizationUser;
+import com.zhongshu.card.server.core.service.base.SuperService;
+import com.zhongshu.card.server.core.util.BeanUtils;
+import com.zhongshu.card.server.core.util.CommonUtil;
+import com.zhongshu.card.server.core.util.ExcelUtils;
+import com.zhongshu.card.server.core.util.excel.CommonExeclParam;
+import com.zhongshu.card.server.core.util.excel.CommonExeclTd;
+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;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+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.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @author TRX
+ * @date 2024/6/12
+ */
+@Slf4j
+@Service
+public class SchoolUserServiceImpl extends SuperService implements SchoolUserService {
+
+    @Autowired
+    UserAccountService userAccountService;
+
+    @Autowired
+    OrganizationUserDao organizationUserDao;
+
+    @Autowired
+    OrganizationDao organizationDao;
+
+    /**
+     * 导入 学校用户excel
+     *
+     * @param request
+     * @param response
+     * @param file
+     * @return
+     */
+    @Override
+    public ResultContent<ImportUserModel> importSchoolUsers(HttpServletRequest request,
+            HttpServletResponse response, MultipartFile file) {
+        String oid = getCurrentOid();
+        Assert.hasText(oid, "oid不能为空");
+
+        ImportUserModel model = new ImportUserModel();
+        try {
+            int startRow = 1;
+            ImportParams params = new ImportParams();
+            List<ExcelUserParam> list = ExcelImportUtil.importExcel(file.getInputStream(),
+                    ExcelUserParam.class, params);
+            model.setTotal(list.size());
+
+            List<String> failDetails = new ArrayList<>();
+            List<UserCountAddParam> userList = new ArrayList<>();
+            if (ObjectUtils.isNotEmpty(list)) {
+                for (ExcelUserParam param1 : list) {
+                    // 验证数据合法性
+                    boolean b = true;
+                    if (b && StringUtils.isEmpty(param1.getName())) {
+                        b = false;
+                        failDetails.add(String.format("第%d行名称不能为空", startRow));
+                    }
+                    if (b && StringUtils.isEmpty(param1.getCode())) {
+                        b = false;
+                        failDetails.add(String.format("第%d行编码不能为空", startRow));
+                    }
+                    if (b && StringUtils.isEmpty(param1.getPhone())) {
+                        b = false;
+                        failDetails.add(String.format("第%d行电话不能为空", startRow));
+                    }
+                    if (b) {
+                        if (StringUtils.isEmpty(param1.getCardNumber())) {
+                            b = false;
+                            failDetails.add(String.format("第%d行身份证号不能为空", startRow));
+                        } else if (param1.getCardNumber().length() != 18) {
+                            b = false;
+                            failDetails.add(String.format("第%d行身份证号格式不正确", startRow));
+                        }
+                    }
+                    if (b) {
+                        // 验证通过
+                        UserCountAddParam addParam = new UserCountAddParam();
+                        initDefaultUserAndOid(addParam);
+                        BeanUtils.copyProperties(param1, addParam);
+                        if (StringUtils.isNotBlank(param1.getSexStr())) {
+                            addParam.setSex(CommonUtil.getSexByStr(param1.getSexStr()));
+                        }
+                        userList.add(addParam);
+                    }
+                    startRow++;
+                }
+
+                model.setSuccess(userList.size());
+                model.setFailDetails(failDetails);
+            }
+        } catch (Exception e) {
+            return ResultContent.buildFail(String.format("导入出错:%s", e.getMessage()));
+        }
+        return ResultContent.buildSuccess(model);
+    }
+
+
+    /**
+     * 导出学校用户
+     *
+     * @param request
+     * @param response
+     * @param param
+     */
+    public void exportSchoolUser(HttpServletRequest request, HttpServletResponse response,
+            OrganizationUserSearch param) {
+        initOidSearchParam(param);
+        Organization organization = organizationDao.findTopByOid(param.getOid());
+        Pageable pageable = PageRequest.of(0, Integer.MAX_VALUE);
+        Page<OrganizationUser> page = organizationUserDao.page(pageable, param);
+
+        List<Map<String, Object>> maps = new ArrayList<>();
+        if (page.getContent() != null) {
+            List<OrganizationUser> list = page.getContent();
+            maps = list.stream().map(it -> {
+                Map<String, Object> map = BeanUtil.bean2Map(it);
+                String sex = "";
+                if (it.getUser() != null && it.getUser().getSex() != null) {
+                    sex = it.getUser().getSex().getRemark();
+                }
+                map.put("sexStr", sex);
+                return map;
+            }).collect(Collectors.toList());
+        }
+        CommonExeclParam execlParam = new CommonExeclParam();
+        execlParam.setTitle(String.format("%s用户列表", organization.getName()));
+        execlParam.setStartRow(2);
+        execlParam.setDatas(maps);
+
+        List<CommonExeclTd> tds = new ArrayList<>();
+        tds.add(CommonExeclTd.build("人员编号", "code"));
+        tds.add(CommonExeclTd.build("姓名", "name"));
+        tds.add(CommonExeclTd.build("性别", "sexStr"));
+        tds.add(CommonExeclTd.build("手机号", "phone"));
+        tds.add(CommonExeclTd.build("身份证号", "cardNumber"));
+        tds.add(CommonExeclTd.build("备注", "remark"));
+
+        execlParam.setTds(tds);
+        ExcelUtils.commonExecuteExcel(request, response, execlParam);
+    }
+
+}

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

@@ -6,6 +6,7 @@ import com.google.zxing.client.j2se.MatrixToImageWriter;
 import com.google.zxing.common.BitMatrix;
 import com.google.zxing.qrcode.QRCodeWriter;
 import com.zhongshu.card.client.utils.ITree;
+import com.zhongshu.card.client.utils.type.Sex;
 import com.zhongshu.card.server.core.domain.base.SuperMain;
 import com.zhongshu.card.server.core.util.exception.BusinessException;
 import lombok.SneakyThrows;
@@ -423,4 +424,17 @@ public class CommonUtil {
         }
         return result;
     }
+
+    public static Sex getSexByStr(String str) {
+        if (StringUtils.isNotEmpty(str)) {
+            str = str.trim();
+            for (Sex sex : Sex.values()) {
+                if (sex.getRemark().equals(str)) {
+                    return sex;
+                }
+            }
+        }
+        return null;
+    }
+
 }