瀏覽代碼

加入异步导入导出

wangliang 4 年之前
父節點
當前提交
3a16bf2d23
共有 18 個文件被更改,包括 966 次插入2 次删除
  1. 100 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/excel/UserExportDto.java
  2. 105 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/excel/UserImportDto.java
  3. 31 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/query/ArraysParams.java
  4. 9 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/SysUser.java
  5. 12 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/SysUserMapper.java
  6. 12 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/SysUserService.java
  7. 9 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/SysUserServiceImpl.java
  8. 44 0
      distributed-print-business/src/main/resources/mapper/SysUserMapper.xml
  9. 1 0
      distributed-print-common/src/main/java/com/qmth/distributed/print/common/contant/SystemConstant.java
  10. 121 0
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/templete/execute/AsyncUserImportTempleteService.java
  11. 97 0
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/templete/execute/UserImportTempleteService.java
  12. 27 0
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/templete/export/AsyncExportTaskTemplete.java
  13. 23 0
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/templete/export/SyncExportTaskTemplete.java
  14. 140 0
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/templete/importData/AsyncImportTaskTemplete.java
  15. 25 0
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/templete/importData/SyncImportTaskTemplete.java
  16. 25 0
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/templete/service/TaskLogicService.java
  17. 95 0
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/templete/service/impl/TaskLogicServiceImpl.java
  18. 90 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/SysUserController.java

+ 100 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/excel/UserExportDto.java

@@ -0,0 +1,100 @@
+package com.qmth.distributed.print.business.bean.dto.excel;
+
+import com.qmth.distributed.print.business.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/** 
+* @Description: 用户导出dto
+* @Param:  
+* @return:  
+* @Author: wangliang
+* @Date: 2021/3/30 
+*/ 
+public class UserExportDto implements Serializable {
+
+    @ApiModelProperty(name = "姓名")
+    @ExcelProperty(name = "姓名", width = 30, index = 1)
+    String name;
+
+    @ApiModelProperty(name = "登录名")
+    @ExcelProperty(name = "登录名", width = 30, index = 2)
+    String loginName;
+
+    @ApiModelProperty(name = "角色")
+    @ExcelProperty(name = "角色", width = 30, index = 3)
+    String roleName;
+
+    @ApiModelProperty(name = "学校名称代码")
+    @ExcelProperty(name = "学校名称代码", width = 40, index = 4)
+    String schoolNameCode;
+
+    @ApiModelProperty(name = "状态")
+    @ExcelProperty(name = "状态", width = 30, index = 6)
+    String enable;
+
+    @ApiModelProperty(name = "更新时间")
+    @ExcelProperty(name = "更新时间", width = 30, index = 7)
+    String updateTime;
+
+    @ApiModelProperty(name = "执行人")
+    @ExcelProperty(name = "执行人", width = 30, index = 8)
+    String updateName;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+    public String getRoleName() {
+        return roleName;
+    }
+
+    public void setRoleName(String roleName) {
+        this.roleName = roleName;
+    }
+
+    public String getSchoolNameCode() {
+        return schoolNameCode;
+    }
+
+    public void setSchoolNameCode(String schoolNameCode) {
+        this.schoolNameCode = schoolNameCode;
+    }
+
+    public String getEnable() {
+        return enable;
+    }
+
+    public void setEnable(String enable) {
+        this.enable = enable;
+    }
+
+    public String getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(String updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public String getUpdateName() {
+        return updateName;
+    }
+
+    public void setUpdateName(String updateName) {
+        this.updateName = updateName;
+    }
+}

+ 105 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/excel/UserImportDto.java

@@ -0,0 +1,105 @@
+package com.qmth.distributed.print.business.bean.dto.excel;
+
+import com.qmth.distributed.print.business.annotation.ExcelNote;
+import com.qmth.distributed.print.business.entity.SysRole;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @Description: 用户导入dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/3/29
+ */
+public class UserImportDto implements Serializable {
+
+    @NotNull
+    @ExcelNote(value = "姓名")
+    @ApiModelProperty(value = "姓名")
+    String name;
+
+    @NotNull
+    @ExcelNote(value = "登录名")
+    @ApiModelProperty(value = "登录名")
+    String loginName;
+
+    @NotNull
+    @ExcelNote(value = "密码")
+    @ApiModelProperty(value = "密码")
+    String password;
+
+    @NotNull
+    @ExcelNote(value = "角色")
+    @ApiModelProperty(value = "角色")
+    String role;
+
+    @ExcelNote(value = "学校代码")
+    @ApiModelProperty(value = "学校代码")
+    String schoolCode;
+
+    @ExcelNote(value = "学校名称")
+    @ApiModelProperty(value = "学校名称")
+    String schoolName;
+
+    @ApiModelProperty(value = "角色")
+    SysRole sysRole;
+
+    public SysRole getSysRole() {
+        return sysRole;
+    }
+
+    public void setSysRole(SysRole sysRole) {
+        this.sysRole = sysRole;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getRole() {
+        return role;
+    }
+
+    public void setRole(String role) {
+        this.role = role;
+    }
+
+    public String getSchoolCode() {
+        return schoolCode;
+    }
+
+    public void setSchoolCode(String schoolCode) {
+        this.schoolCode = schoolCode;
+    }
+
+    public String getSchoolName() {
+        return schoolName;
+    }
+
+    public void setSchoolName(String schoolName) {
+        this.schoolName = schoolName;
+    }
+}

+ 31 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/query/ArraysParams.java

@@ -0,0 +1,31 @@
+package com.qmth.distributed.print.business.bean.query;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotEmpty;
+import java.io.Serializable;
+
+/**
+ * @Description: 数组参数params
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/3/24
+ */
+public class ArraysParams implements Serializable {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "数组id")
+    @NotEmpty(message = "id不能为空")
+    Long[] ids;
+
+    public Long[] getIds() {
+        return ids;
+    }
+
+    public void setIds(Long[] ids) {
+        this.ids = ids;
+    }
+}

+ 9 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/SysUser.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.qmth.distributed.print.business.base.BaseEntity;
 import com.qmth.distributed.print.business.base.BaseEntity;
+import com.qmth.distributed.print.common.contant.SystemConstant;
 
 
 import java.io.Serializable;
 import java.io.Serializable;
 
 
@@ -72,6 +73,14 @@ public class SysUser extends BaseEntity implements Serializable {
     @TableField(exist = false)
     @TableField(exist = false)
     private Long[] courseIds;
     private Long[] courseIds;
 
 
+    public void setInsertInfo(Long userId) {
+        setId(SystemConstant.getDbUuid());
+        setCreateId(userId);
+        setUpdateId(userId);
+        setCreateTime(System.currentTimeMillis());
+        setUpdateTime(System.currentTimeMillis());
+    }
+
     public Long getSchoolId() {
     public Long getSchoolId() {
         return schoolId;
         return schoolId;
     }
     }

+ 12 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/SysUserMapper.java

@@ -4,10 +4,14 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.distributed.print.business.bean.dto.UserDto;
 import com.qmth.distributed.print.business.bean.dto.UserDto;
+import com.qmth.distributed.print.business.bean.dto.excel.UserExportDto;
+import com.qmth.distributed.print.business.bean.query.ArraysParams;
 import com.qmth.distributed.print.business.bean.query.UserParam;
 import com.qmth.distributed.print.business.bean.query.UserParam;
 import com.qmth.distributed.print.business.entity.SysUser;
 import com.qmth.distributed.print.business.entity.SysUser;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Param;
 
 
+import java.util.List;
+
 /**
 /**
  * <p>
  * <p>
  * 用户表 Mapper 接口
  * 用户表 Mapper 接口
@@ -19,4 +23,12 @@ import org.apache.ibatis.annotations.Param;
 public interface SysUserMapper extends BaseMapper<SysUser> {
 public interface SysUserMapper extends BaseMapper<SysUser> {
 
 
     IPage<UserDto> listPage(Page<UserDto> page, @Param("schoolId") Long schoolId, @Param("realName") String realName, @Param("roleId") String roleId, @Param("enable") Boolean enable);
     IPage<UserDto> listPage(Page<UserDto> page, @Param("schoolId") Long schoolId, @Param("realName") String realName, @Param("roleId") String roleId, @Param("enable") Boolean enable);
+
+    /**
+     * 用户导出
+     *
+     * @param arraysParams
+     * @return
+     */
+    public List<UserExportDto> queryByExport(@Param("arraysParams") ArraysParams arraysParams);
 }
 }

+ 12 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/SysUserService.java

@@ -4,9 +4,13 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.distributed.print.business.bean.dto.LoginDto;
 import com.qmth.distributed.print.business.bean.dto.LoginDto;
 import com.qmth.distributed.print.business.bean.dto.UserDto;
 import com.qmth.distributed.print.business.bean.dto.UserDto;
+import com.qmth.distributed.print.business.bean.dto.excel.UserExportDto;
+import com.qmth.distributed.print.business.bean.query.ArraysParams;
 import com.qmth.distributed.print.business.bean.query.UserParam;
 import com.qmth.distributed.print.business.bean.query.UserParam;
 import com.qmth.distributed.print.business.entity.SysUser;
 import com.qmth.distributed.print.business.entity.SysUser;
 
 
+import java.util.List;
+
 /**
 /**
  * <p>
  * <p>
  * 用户表 服务类
  * 用户表 服务类
@@ -30,4 +34,12 @@ public interface SysUserService extends IService<SysUser> {
     boolean bindRoles(SysUser sysUser);
     boolean bindRoles(SysUser sysUser);
 
 
     LoginDto getUserRoles(SysUser sysUser);
     LoginDto getUserRoles(SysUser sysUser);
+
+    /**
+     * 用户导出
+     *
+     * @param arraysParams
+     * @return
+     */
+    public List<UserExportDto> queryByExport(ArraysParams arraysParams);
 }
 }

+ 9 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/SysUserServiceImpl.java

@@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.distributed.print.business.bean.dto.LoginDto;
 import com.qmth.distributed.print.business.bean.dto.LoginDto;
 import com.qmth.distributed.print.business.bean.dto.UserDto;
 import com.qmth.distributed.print.business.bean.dto.UserDto;
+import com.qmth.distributed.print.business.bean.dto.excel.UserExportDto;
+import com.qmth.distributed.print.business.bean.query.ArraysParams;
 import com.qmth.distributed.print.business.entity.BasicCourse;
 import com.qmth.distributed.print.business.entity.BasicCourse;
 import com.qmth.distributed.print.business.entity.SysRole;
 import com.qmth.distributed.print.business.entity.SysRole;
 import com.qmth.distributed.print.business.entity.SysUser;
 import com.qmth.distributed.print.business.entity.SysUser;
@@ -21,6 +23,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 
 
+import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Arrays;
 import java.util.List;
 import java.util.List;
@@ -53,6 +56,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     @Autowired
     @Autowired
     private SysUserRoleService sysUserRoleService;
     private SysUserRoleService sysUserRoleService;
 
 
+    @Resource
+    SysUserMapper sysUserMapper;
 
 
     @Override
     @Override
     public IPage<UserDto> list(Long schoolId, String realName, String roleId, Boolean enable, Integer pageNumber, Integer pageSize) {
     public IPage<UserDto> list(Long schoolId, String realName, String roleId, Boolean enable, Integer pageNumber, Integer pageSize) {
@@ -219,4 +224,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         return loginDto;
         return loginDto;
     }
     }
 
 
+    @Override
+    public List<UserExportDto> queryByExport(ArraysParams arraysParams) {
+        return sysUserMapper.queryByExport(arraysParams);
+    }
 }
 }

+ 44 - 0
distributed-print-business/src/main/resources/mapper/SysUserMapper.xml

@@ -50,4 +50,48 @@
         </where>
         </where>
     </select>
     </select>
 
 
+    <select id="queryByExport" resultType="com.qmth.distributed.print.business.bean.dto.excel.UserExportDto">
+        select
+            tbu.real_name as realName,
+            tbu.login_name as loginName,
+            tbr.name as roleName,
+            group_concat(tbs.name, CONCAT(CONCAT('(', tbs.code), ')')) as schoolNameCode,
+            if(tbu.enable = 1,
+            '启用',
+            '禁用') as enable,
+            FROM_UNIXTIME(tbu.update_time / 1000, '%Y-%m-%d %H:%i:%s') as updateTime,
+            (
+            select
+            t.real_name
+            from
+            sys_user t
+            where
+            t.id = tbu.update_id) as updateName
+            from
+            sys_user tbu
+            left join (
+            select
+            DISTINCT role_id,
+            user_id
+            from
+            sys_user_role) tburp on
+            tburp.user_id = tbu.id
+            left join sys_role tbr on
+            tbr.id = tburp.role_id
+            left join basic_school tbs on
+            tbs.id = tbu.school_id
+            <where>
+                and tbu.id in
+                <foreach collection="arraysParams.ids" item="id" index="index" open="(" close=")" separator=",">
+                    #{id}
+                </foreach>
+            </where>
+            group by
+                tbu.real_name,
+                tbu.login_name,
+                tbr.name,
+                tbu.enable,
+                tbu.update_time,
+                tbu.update_id
+    </select>
 </mapper>
 </mapper>

+ 1 - 0
distributed-print-common/src/main/java/com/qmth/distributed/print/common/contant/SystemConstant.java

@@ -45,6 +45,7 @@ public class SystemConstant {
     public static final String UPLOAD_TYPE = "uploadType";
     public static final String UPLOAD_TYPE = "uploadType";
     public static final String HTTP = "http://";
     public static final String HTTP = "http://";
     public static final String ID = "id";
     public static final String ID = "id";
+    public static final String FILE = "file";
     public static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd HH:mm:ss";
     public static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd HH:mm:ss";
     public static final int PAGE_NUMBER = 0;
     public static final int PAGE_NUMBER = 0;
     public static final int PAGE_SIZE = 10000000;
     public static final int PAGE_SIZE = 10000000;

+ 121 - 0
distributed-print-task/src/main/java/com/qmth/distributed/print/task/templete/execute/AsyncUserImportTempleteService.java

@@ -0,0 +1,121 @@
+package com.qmth.distributed.print.task.templete.execute;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.google.common.collect.Lists;
+import com.qmth.boot.api.exception.ApiException;
+import com.qmth.distributed.print.business.bean.dto.excel.UserImportDto;
+import com.qmth.distributed.print.business.entity.SysRole;
+import com.qmth.distributed.print.business.entity.TBTask;
+import com.qmth.distributed.print.business.enums.RoleTypeEnum;
+import com.qmth.distributed.print.business.enums.TaskResultEnum;
+import com.qmth.distributed.print.business.enums.TaskStatusEnum;
+import com.qmth.distributed.print.business.service.SysRoleService;
+import com.qmth.distributed.print.business.util.ExcelUtil;
+import com.qmth.distributed.print.business.util.excel.ExcelError;
+import com.qmth.distributed.print.common.contant.SystemConstant;
+import com.qmth.distributed.print.common.enums.ExceptionResultEnum;
+import com.qmth.distributed.print.common.util.Result;
+import com.qmth.distributed.print.common.util.ResultUtil;
+import com.qmth.distributed.print.task.templete.importData.AsyncImportTaskTemplete;
+import com.qmth.distributed.print.task.templete.service.TaskLogicService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.util.LinkedMultiValueMap;
+
+import javax.annotation.Resource;
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.MessageFormat;
+import java.util.*;
+
+/**
+ * @Description: 用户导入模版
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/3/29
+ */
+@Service
+public class AsyncUserImportTempleteService extends AsyncImportTaskTemplete {
+    private final static Logger log = LoggerFactory.getLogger(AsyncUserImportTempleteService.class);
+
+    public static final String OBJ_TITLE = "用户数据";
+
+    @Resource
+    TaskLogicService taskLogicService;
+
+    @Resource
+    SysRoleService sysRoleService;
+
+    /**
+     * 异步处理导入
+     *
+     * @param map
+     * @return
+     */
+    @Override
+    public Result importTask(Map<String, Object> map) throws IOException {
+        TBTask tbTask = (TBTask) map.get(SystemConstant.TASK);
+        InputStream inputStream = super.getUploadFileInputStream(tbTask);
+        StringJoiner stringJoinerSummary = new StringJoiner("\n")
+                .add(MessageFormat.format("{0}{1}{2}", FORMAT_TIME, BEGIN_TITLE, OBJ_TITLE));
+        tbTask.setStatus(TaskStatusEnum.RUNNING);
+        try {
+            List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(inputStream, Lists.newArrayList(UserImportDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
+                List<ExcelError> excelErrorTemp = new ArrayList<>();
+                for (int i = 0; i < finalExcelList.size(); i++) {
+                    LinkedMultiValueMap<Integer, Object> excelMap = finalExcelList.get(i);
+                    List<Object> userImportDtoList = excelMap.get(i);
+                    for (int y = 0; y < userImportDtoList.size(); y++) {
+                        UserImportDto userImportDto = (UserImportDto) userImportDtoList.get(y);
+                        excelErrorTemp.addAll(ExcelUtil.checkExcelField(userImportDto, y, i));
+                        //查角色名是否存在
+                        QueryWrapper<SysRole> sysRoleQueryWrapper = new QueryWrapper<>();
+                        sysRoleQueryWrapper.lambda().eq(SysRole::getName, userImportDto.getRole());
+                        SysRole sysRole = sysRoleService.getOne(sysRoleQueryWrapper);
+                        if (Objects.isNull(sysRole)) {
+                            throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[角色名]不存在")));
+                        }
+                        if (sysRole.getType() == RoleTypeEnum.SCHOOL_ADMIN && Objects.isNull(userImportDto.getSchoolCode())) {
+                            excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[学校代码]必填"));
+                        }
+                        if (userImportDto.getPassword().length() < 6) {
+                            excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[密码]不能小于6位"));
+                        } else if (userImportDto.getPassword().length() > 30) {
+                            excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[密码]不能大于30位"));
+                        }
+                        if (userImportDto.getName().length() > 25) {
+                            excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[姓名]不能超过25个字符"));
+                        }
+                        if (userImportDto.getLoginName().length() > 25) {
+                            excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[登录名]不能超过25个字符"));
+                        }
+                        userImportDto.setSysRole(sysRole);
+                    }
+                }
+                if (excelErrorTemp.size() > 0) {
+                    throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(excelErrorTemp));
+                }
+                return finalExcelList;
+            });
+//            Map<String, Object> mapLogic = taskLogicService.executeUserImportLogic(finalList, map);
+            stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", FORMAT_TIME, FINISH_TITLE, 111, FINISH_SIZE));
+            tbTask.setResult(TaskResultEnum.SUCCESS);
+        } catch (Exception e) {
+            log.error("请求出错", e);
+            stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", FORMAT_TIME, EXCEPTION_TITLE, EXCEPTION_DATA, e.getMessage()));
+            tbTask.setResult(TaskResultEnum.ERROR);
+            if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        } finally {//生成txt文件
+            tbTask.setSummary(stringJoinerSummary.toString());
+            super.createTxt(tbTask);
+        }
+        return ResultUtil.ok(map);
+    }
+}

+ 97 - 0
distributed-print-task/src/main/java/com/qmth/distributed/print/task/templete/execute/UserImportTempleteService.java

@@ -0,0 +1,97 @@
+package com.qmth.distributed.print.task.templete.execute;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.google.common.collect.Lists;
+import com.qmth.distributed.print.business.bean.dto.excel.UserImportDto;
+import com.qmth.distributed.print.business.entity.SysRole;
+import com.qmth.distributed.print.business.enums.RoleTypeEnum;
+import com.qmth.distributed.print.business.service.SysRoleService;
+import com.qmth.distributed.print.business.util.ExcelUtil;
+import com.qmth.distributed.print.business.util.excel.ExcelError;
+import com.qmth.distributed.print.common.contant.SystemConstant;
+import com.qmth.distributed.print.common.enums.ExceptionResultEnum;
+import com.qmth.distributed.print.common.util.Result;
+import com.qmth.distributed.print.common.util.ResultUtil;
+import com.qmth.distributed.print.task.templete.importData.SyncImportTaskTemplete;
+import com.qmth.distributed.print.task.templete.service.TaskLogicService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * @Description: 用户导入模版
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/3/29
+ */
+@Service
+public class UserImportTempleteService implements SyncImportTaskTemplete, Serializable {
+    private final static Logger log = LoggerFactory.getLogger(UserImportTempleteService.class);
+
+    @Resource
+    TaskLogicService taskLogicService;
+
+    @Resource
+    SysRoleService sysRoleService;
+
+    /**
+     * 处理导入
+     *
+     * @param map
+     * @return
+     */
+    @Override
+    public Result importTask(Map<String, Object> map) throws IOException, NoSuchFieldException {
+        MultipartFile file = (MultipartFile) map.get(SystemConstant.FILE);
+        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(file.getInputStream(), Lists.newArrayList(UserImportDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
+            List<ExcelError> excelErrorTemp = new ArrayList<>();
+            for (int i = 0; i < finalExcelList.size(); i++) {
+                LinkedMultiValueMap<Integer, Object> excelMap = finalExcelList.get(i);
+                List<Object> userImportDtoList = excelMap.get(i);
+                for (int y = 0; y < userImportDtoList.size(); y++) {
+                    UserImportDto userImportDto = (UserImportDto) userImportDtoList.get(y);
+                    excelErrorTemp.addAll(ExcelUtil.checkExcelField(userImportDto, y, i));
+                    //查角色名是否存在
+                    QueryWrapper<SysRole> sysRoleQueryWrapper = new QueryWrapper<>();
+                    sysRoleQueryWrapper.lambda().eq(SysRole::getName, userImportDto.getRole());
+                    SysRole sysRole = sysRoleService.getOne(sysRoleQueryWrapper);
+                    if (Objects.isNull(sysRole)) {
+                        throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[角色名]不存在")));
+                    }
+                    if (sysRole.getType() == RoleTypeEnum.SCHOOL_ADMIN && Objects.isNull(userImportDto.getSchoolCode())) {
+                        excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[学校代码]必填"));
+                    }
+                    if (userImportDto.getPassword().length() < 6) {
+                        excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[密码]不能小于6位"));
+                    } else if (userImportDto.getPassword().length() > 30) {
+                        excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[密码]不能大于30位"));
+                    }
+                    if (userImportDto.getName().length() > 25) {
+                        excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[姓名]不能超过25个字符"));
+                    }
+                    if (userImportDto.getLoginName().length() > 25) {
+                        excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[登录名]不能超过25个字符"));
+                    }
+                    userImportDto.setSysRole(sysRole);
+                }
+            }
+            if (excelErrorTemp.size() > 0) {
+                throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(excelErrorTemp));
+            }
+            return finalExcelList;
+        });
+        return ResultUtil.ok(taskLogicService.executeUserImportLogic(finalList, map));
+    }
+}

+ 27 - 0
distributed-print-task/src/main/java/com/qmth/distributed/print/task/templete/export/AsyncExportTaskTemplete.java

@@ -0,0 +1,27 @@
+package com.qmth.distributed.print.task.templete.export;
+
+import com.qmth.distributed.print.common.util.Result;
+import org.springframework.scheduling.annotation.Async;
+
+import java.util.Map;
+
+/**
+ * @Description: 异步导出模版
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/3/29
+ */
+public abstract class AsyncExportTaskTemplete {
+
+    /**
+     * 异步导出任务
+     *
+     * @param map
+     * @return
+     */
+    @Async
+    Result exportTask(Map<String, Object> map) {
+        return null;
+    }
+}

+ 23 - 0
distributed-print-task/src/main/java/com/qmth/distributed/print/task/templete/export/SyncExportTaskTemplete.java

@@ -0,0 +1,23 @@
+package com.qmth.distributed.print.task.templete.export;
+
+import com.qmth.distributed.print.common.util.Result;
+
+import java.util.Map;
+
+/**
+ * @Description: 同步导出模版
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/3/29
+ */
+public interface SyncExportTaskTemplete {
+
+    /**
+     * 同步导出任务
+     *
+     * @param map
+     * @return
+     */
+    Result exportTask(Map<String, Object> map);
+}

+ 140 - 0
distributed-print-task/src/main/java/com/qmth/distributed/print/task/templete/importData/AsyncImportTaskTemplete.java

@@ -0,0 +1,140 @@
+package com.qmth.distributed.print.task.templete.importData;
+
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.qmth.boot.api.exception.ApiException;
+import com.qmth.distributed.print.business.entity.TBTask;
+import com.qmth.distributed.print.business.enums.TaskStatusEnum;
+import com.qmth.distributed.print.business.enums.UploadFileEnum;
+import com.qmth.distributed.print.business.service.TBTaskService;
+import com.qmth.distributed.print.business.util.OssUtil;
+import com.qmth.distributed.print.common.contant.SpringContextHolder;
+import com.qmth.distributed.print.common.contant.SystemConstant;
+import com.qmth.distributed.print.common.util.Result;
+import com.qmth.distributed.print.common.util.ResultUtil;
+import org.apache.commons.io.FileUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.annotation.Async;
+
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+import java.util.Date;
+import java.util.Map;
+import java.util.Objects;
+import java.util.StringJoiner;
+
+/**
+ * @Description: 异步导入模版
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/3/29
+ */
+public abstract class AsyncImportTaskTemplete {
+    private final static Logger log = LoggerFactory.getLogger(AsyncImportTaskTemplete.class);
+
+    public static final String BEGIN_TITLE = "->开始准备处理导入的";
+    public static final String EXCEPTION_TITLE = "->数据处理发生异常!";
+    public static final String EXCEPTION_DATA = "错误信息:";
+    public static final String FINISH_TITLE = "->数据处理结束,共处理了";
+    public static final String FINISH_SIZE = "条数据";
+    public static final String TXT_PREFIX = ".txt";
+    public static final String FORMAT_TIME = DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN);
+
+    /**
+     * 异步导入任务
+     *
+     * @param map
+     * @return
+     * @throws IOException
+     */
+    @Async
+    public abstract Result importTask(Map<String, Object> map) throws IOException;
+
+    /**
+     * 获取上传的文件
+     *
+     * @param tbTask
+     * @return
+     * @throws IOException
+     */
+    public InputStream getUploadFileInputStream(TBTask tbTask) throws IOException {
+        OssUtil ossUtil = SpringContextHolder.getBean(OssUtil.class);
+        JSONObject jsonObject = JSONObject.parseObject(tbTask.getImportFilePath());
+        String path = (String) jsonObject.get(SystemConstant.PATH);
+        String type = (String) jsonObject.get(SystemConstant.TYPE);
+        InputStream inputStream = null;
+        if (Objects.equals(type, SystemConstant.OSS)) {
+            byte[] data = ossUtil.ossDownload(path);
+            inputStream = new ByteArrayInputStream(data);
+        } else {
+            StringJoiner localPath = new StringJoiner("").add(SystemConstant.TEMP_FILES_DIR).add(File.separator).add(path);
+            inputStream = new FileInputStream(new File(localPath.toString()));
+        }
+        return inputStream;
+    }
+
+    /**
+     * 创建txt文件
+     *
+     * @param tbTask
+     */
+    public void createTxt(TBTask tbTask) {
+        OssUtil ossUtil = SpringContextHolder.getBean(OssUtil.class);
+        TBTaskService tbTaskService = SpringContextHolder.getBean(TBTaskService.class);
+        ByteArrayOutputStream out = null;
+        InputStream inputStream = null;
+        try {
+            JSONObject jsonObject = JSONObject.parseObject(tbTask.getImportFilePath());
+            String path = (String) jsonObject.get(SystemConstant.PATH);
+            String type = (String) jsonObject.get(SystemConstant.TYPE);
+
+            out = new ByteArrayOutputStream();
+            out.write(tbTask.getSummary().getBytes(StandardCharsets.UTF_8));
+            byte[] bookByteAry = out.toByteArray();
+            inputStream = new ByteArrayInputStream(bookByteAry);
+            StringJoiner stringJoiner = new StringJoiner("");
+            path = path.substring(0, path.lastIndexOf(File.separator) + 1);
+
+            stringJoiner.add(path).add(SystemConstant.getUuid()).add(TXT_PREFIX).toString();
+            if (Objects.equals(type, SystemConstant.OSS)) {//上传至oss
+                ossUtil.ossUpload(stringJoiner.toString(), inputStream, null);
+            } else {//上传至服务器
+                File finalFile = new File(stringJoiner.toString());
+                if (!finalFile.exists()) {
+                    finalFile.getParentFile().mkdirs();
+                    finalFile.createNewFile();
+                }
+                FileUtils.copyInputStreamToFile(inputStream, finalFile);
+            }
+            JSONObject json = new JSONObject();
+            json.put(SystemConstant.PATH, stringJoiner.toString());
+            json.put(SystemConstant.TYPE, type);
+            json.put(SystemConstant.UPLOAD_TYPE, UploadFileEnum.FILE);
+
+            tbTask.setStatus(TaskStatusEnum.FINISH);
+            tbTask.setReportFilePath(json.toJSONString());
+            tbTaskService.updateById(tbTask);
+        } catch (Exception e) {
+            log.error("请求出错", e);
+            if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        } finally {
+            try {
+                if (Objects.nonNull(inputStream)) {
+                    inputStream.close();
+                }
+                if (Objects.nonNull(out)) {
+                    out.flush();
+                    out.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+}

+ 25 - 0
distributed-print-task/src/main/java/com/qmth/distributed/print/task/templete/importData/SyncImportTaskTemplete.java

@@ -0,0 +1,25 @@
+package com.qmth.distributed.print.task.templete.importData;
+
+import com.qmth.distributed.print.common.util.Result;
+
+import java.io.IOException;
+import java.util.Map;
+
+/**
+ * @Description: 同步导入模版
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/3/29
+ */
+public interface SyncImportTaskTemplete {
+
+    /**
+     * 同步导入任务
+     *
+     * @param map
+     * @return
+     * @throws IOException,NoSuchFieldException
+     */
+    Result importTask(Map<String, Object> map) throws IOException, NoSuchFieldException;
+}

+ 25 - 0
distributed-print-task/src/main/java/com/qmth/distributed/print/task/templete/service/TaskLogicService.java

@@ -0,0 +1,25 @@
+package com.qmth.distributed.print.task.templete.service;
+
+import org.springframework.util.LinkedMultiValueMap;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 任务处理逻辑
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/3/29
+ */
+public interface TaskLogicService {
+
+    /**
+     * 执行导入用户逻辑
+     *
+     * @param finalList
+     * @param map
+     * @return
+     */
+    public Map<String, Object> executeUserImportLogic(List<LinkedMultiValueMap<Integer, Object>> finalList, Map<String, Object> map);
+}

+ 95 - 0
distributed-print-task/src/main/java/com/qmth/distributed/print/task/templete/service/impl/TaskLogicServiceImpl.java

@@ -0,0 +1,95 @@
+package com.qmth.distributed.print.task.templete.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.google.gson.Gson;
+import com.qmth.distributed.print.business.bean.dto.excel.UserImportDto;
+import com.qmth.distributed.print.business.entity.BasicSchool;
+import com.qmth.distributed.print.business.entity.SysUser;
+import com.qmth.distributed.print.business.service.BasicSchoolService;
+import com.qmth.distributed.print.business.service.CommonService;
+import com.qmth.distributed.print.business.service.SysUserService;
+import com.qmth.distributed.print.business.util.ServletUtil;
+import com.qmth.distributed.print.business.util.excel.ExcelError;
+import com.qmth.distributed.print.common.enums.ExceptionResultEnum;
+import com.qmth.distributed.print.common.util.Base64Util;
+import com.qmth.distributed.print.task.templete.service.TaskLogicService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.LinkedMultiValueMap;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * @Description: 任务处理逻辑impl
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/3/29
+ */
+@Service
+public class TaskLogicServiceImpl implements TaskLogicService {
+
+    @Resource
+    SysUserService sysUserService;
+
+    @Resource
+    BasicSchoolService basicSchoolService;
+
+    @Resource
+    CommonService commonService;
+
+    /**
+     * 执行导入用户逻辑
+     *
+     * @param finalList
+     * @param map
+     * @return
+     */
+    @Override
+    @Transactional
+    public Map<String, Object> executeUserImportLogic(List<LinkedMultiValueMap<Integer, Object>> finalList, Map<String, Object> map) {
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+        Gson gson = new Gson();
+        LinkedMultiValueMap<Long, SysUser> tbUserLinkedMultiValueMap = new LinkedMultiValueMap<>();
+        for (int i = 0; i < finalList.size(); i++) {
+            LinkedMultiValueMap<Integer, Object> excelMap = finalList.get(i);
+            List<Object> userImportDtoList = excelMap.get(i);
+            for (int y = 0; y < userImportDtoList.size(); y++) {
+                UserImportDto userImportDto = (UserImportDto) userImportDtoList.get(y);
+                SysUser sysUser = gson.fromJson(gson.toJson(userImportDto), SysUser.class);
+
+                //查用户登录名是否重复
+                QueryWrapper<SysUser> sysUserQueryWrapper = new QueryWrapper<>();
+                sysUserQueryWrapper.lambda().eq(SysUser::getLoginName, userImportDto.getLoginName());
+                long count = sysUserService.count(sysUserQueryWrapper);
+                if (count > 0) {
+                    throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[登录名]重复")));
+                }
+                //查学校是否存在
+                if (Objects.nonNull(userImportDto.getSchoolCode())) {
+                    QueryWrapper<BasicSchool> basicSchoolQueryWrapper = new QueryWrapper<>();
+                    basicSchoolQueryWrapper.lambda().eq(BasicSchool::getCode, userImportDto.getSchoolCode());
+                    BasicSchool basicSchool = basicSchoolService.getOne(basicSchoolQueryWrapper);
+                    if (Objects.isNull(basicSchool)) {
+                        throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[学校代码]不存在")));
+                    }
+                    sysUser.setSchoolId(basicSchool.getId());
+                }
+                sysUser.setInsertInfo(requestUser.getId());
+                sysUser.setPassword(Base64Util.encode(userImportDto.getPassword().getBytes()));
+                tbUserLinkedMultiValueMap.add(userImportDto.getSysRole().getId(), sysUser);
+            }
+        }
+        tbUserLinkedMultiValueMap.forEach((k, v) -> {
+            sysUserService.saveBatch(v);
+            v.forEach(s -> {
+                commonService.addUserRolePrivilege(s, k);
+            });
+        });
+        return map;
+    }
+}

+ 90 - 2
distributed-print/src/main/java/com/qmth/distributed/print/api/SysUserController.java

@@ -5,21 +5,47 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.qmth.boot.api.annotation.Aac;
 import com.qmth.boot.api.annotation.Aac;
 import com.qmth.boot.api.annotation.BOOL;
 import com.qmth.boot.api.annotation.BOOL;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.boot.api.exception.ApiException;
 import com.qmth.distributed.print.business.bean.ApiUser;
 import com.qmth.distributed.print.business.bean.ApiUser;
 import com.qmth.distributed.print.business.bean.dto.UserDto;
 import com.qmth.distributed.print.business.bean.dto.UserDto;
+import com.qmth.distributed.print.business.bean.dto.excel.UserExportDto;
+import com.qmth.distributed.print.business.bean.query.ArraysParams;
 import com.qmth.distributed.print.business.bean.query.UserParam;
 import com.qmth.distributed.print.business.bean.query.UserParam;
+import com.qmth.distributed.print.business.bean.result.EditResult;
+import com.qmth.distributed.print.business.entity.BasicAttachment;
 import com.qmth.distributed.print.business.entity.SysUser;
 import com.qmth.distributed.print.business.entity.SysUser;
+import com.qmth.distributed.print.business.entity.TBTask;
+import com.qmth.distributed.print.business.enums.TaskTypeEnum;
+import com.qmth.distributed.print.business.enums.UploadFileEnum;
+import com.qmth.distributed.print.business.service.BasicAttachmentService;
 import com.qmth.distributed.print.business.service.SysUserService;
 import com.qmth.distributed.print.business.service.SysUserService;
+import com.qmth.distributed.print.business.service.TBTaskService;
+import com.qmth.distributed.print.business.util.ExcelUtil;
 import com.qmth.distributed.print.business.util.RequestUtils;
 import com.qmth.distributed.print.business.util.RequestUtils;
+import com.qmth.distributed.print.business.util.ServletUtil;
+import com.qmth.distributed.print.common.contant.SystemConstant;
+import com.qmth.distributed.print.common.enums.ExceptionResultEnum;
 import com.qmth.distributed.print.common.util.Result;
 import com.qmth.distributed.print.common.util.Result;
 import com.qmth.distributed.print.common.util.ResultUtil;
 import com.qmth.distributed.print.common.util.ResultUtil;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import com.qmth.distributed.print.task.templete.execute.AsyncUserImportTempleteService;
+import com.qmth.distributed.print.task.templete.execute.UserImportTempleteService;
+import io.swagger.annotations.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 import java.util.Map;
+import java.util.Objects;
 
 
 /**
 /**
  * <p>
  * <p>
@@ -34,10 +60,23 @@ import java.util.Map;
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.sys}/user")
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.sys}/user")
 @Aac(auth = BOOL.FALSE)
 @Aac(auth = BOOL.FALSE)
 public class SysUserController {
 public class SysUserController {
+    private final static Logger log = LoggerFactory.getLogger(SysUserController.class);
 
 
     @Autowired
     @Autowired
     private SysUserService sysUserService;
     private SysUserService sysUserService;
 
 
+    @Resource
+    BasicAttachmentService basicAttachmentService;
+
+    @Resource
+    UserImportTempleteService userImportTempleteService;
+
+    @Resource
+    AsyncUserImportTempleteService asyncUserImportTempleteService;
+
+    @Resource
+    TBTaskService tbTaskService;
+
     /**
     /**
      * 查询
      * 查询
      * @param request
      * @param request
@@ -124,5 +163,54 @@ public class SysUserController {
         boolean isSuccess = sysUserService.bindRoles(sysUser);
         boolean isSuccess = sysUserService.bindRoles(sysUser);
         return ResultUtil.ok(isSuccess);
         return ResultUtil.ok(isSuccess);
     }
     }
+
+    @ApiOperation(value = "用户批量导入接口")
+    @RequestMapping(value = "/import", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)})
+    @Transactional
+    public Result userImport(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file) {
+        BasicAttachment basicAttachment = null;
+        try {
+            basicAttachment = basicAttachmentService.saveAttachment(file, ServletUtil.getRequestMd5(), UploadFileEnum.FILE);
+            if (Objects.isNull(basicAttachment)) {
+                throw ExceptionResultEnum.ATTACHMENT_ERROR.exception();
+            } else {
+                userImportTempleteService.importTask(Collections.singletonMap(SystemConstant.FILE, file));
+            }
+        } catch (Exception e) {
+            log.error("请求出错", e);
+            if (Objects.nonNull(basicAttachment)) {
+                basicAttachmentService.deleteAttachment(basicAttachment);
+            }
+            if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        }
+        return ResultUtil.ok();
+    }
+
+    @ApiOperation(value = "异步用户批量导入接口")
+    @RequestMapping(value = "/async/import", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)})
+    public Result userImportAysnc(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file) throws IOException {
+        Map<String, Object> map = tbTaskService.saveTask(file, TaskTypeEnum.USER_IMPORT);
+        asyncUserImportTempleteService.importTask(map);
+        TBTask tbTask = Objects.nonNull(map.get(SystemConstant.TASK)) ? (TBTask) map.get(SystemConstant.TASK) : null;
+        return Objects.nonNull(tbTask) ? ResultUtil.ok(tbTask.getId()) : ResultUtil.error("创建任务失败");
+    }
+
+    @ApiOperation(value = "用户批量导出接口")
+    @RequestMapping(value = "/export", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)})
+    public Result export(@ApiParam(value = "数组id", required = true) @Valid @RequestBody ArraysParams arraysParams, BindingResult bindingResult) throws Exception {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        List<UserExportDto> userExportDtoList = sysUserService.queryByExport(arraysParams);
+        ExcelUtil.excelExport("用户列表", UserExportDto.class, userExportDtoList, ServletUtil.getResponse());
+        return ResultUtil.ok();
+    }
 }
 }