From 2b5ca6cea92ff6a67582c3331a0704480e63b9b4 Mon Sep 17 00:00:00 2001
From: Administrator <admin>
Date: Thu, 02 Sep 2021 11:28:17 +0800
Subject: [PATCH] 1.正式考试,模拟考试考试申请接口修改 2.用户头像批量上传(压缩zip 包上传) 3.通知公告接口修改

---
 src/main/java/org/springblade/common/config/FileConfig.java                                      |   43 ++++
 src/main/java/org/springblade/modules/apply/mapper/ApplyMapper.xml                               |    1 
 src/main/java/org/springblade/modules/apply/service/ApplyService.java                            |    2 
 src/main/java/org/springblade/modules/system/mapper/UserMapper.xml                               |   51 +++--
 src/main/java/org/springblade/modules/training/mapper/TrainingRegistrationMapper.java            |    2 
 src/main/java/org/springblade/modules/training/controller/TrainingRegistrationController.java    |   85 ++++---
 src/main/java/org/springblade/modules/apply/service/impl/ApplyServiceImpl.java                   |    4 
 src/main/java/org/springblade/modules/desk/mapper/NoticeMapper.xml                               |   17 -
 src/main/java/org/springblade/modules/training/mapper/TrainingRegistrationMapper.xml             |    9 
 src/main/java/org/springblade/modules/resource/endpoint/OssEndpoint.java                         |  128 ++++++++++-
 src/main/java/org/springblade/common/utils/FileUtil.java                                         |  187 ++++++++++++++++++
 pom.xml                                                                                          |   14 +
 src/main/java/org/springblade/modules/training/service/impl/TrainingRegistrationServiceImpl.java |    4 
 src/main/java/org/springblade/modules/apply/mapper/ApplyMapper.java                              |    2 
 src/main/resources/application-dev.yml                                                           |    6 
 src/main/java/org/springblade/modules/apply/controller/ApplyController.java                      |    5 
 src/main/java/org/springblade/modules/training/service/TrainingRegistrationService.java          |    2 
 src/main/java/org/springblade/modules/desk/controller/NoticeController.java                      |    2 
 src/main/java/org/springblade/modules/system/vo/UserVO.java                                      |    5 
 19 files changed, 462 insertions(+), 107 deletions(-)

diff --git a/pom.xml b/pom.xml
index 04e5fda..5ba4f0f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -245,6 +245,20 @@
             <artifactId>javase</artifactId>
             <version>3.3.3</version>
         </dependency>
+        <!-- https://mvnrepository.com/artifact/net.lingala.zip4j/zip4j -->
+        <dependency>
+            <groupId>net.lingala.zip4j</groupId>
+            <artifactId>zip4j</artifactId>
+            <version>1.3.2</version>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/org.springframework/spring-mock -->
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-mock</artifactId>
+            <version>2.0.8</version>
+        </dependency>
+
+
     </dependencies>
 
     <build>
diff --git a/src/main/java/org/springblade/common/config/FileConfig.java b/src/main/java/org/springblade/common/config/FileConfig.java
new file mode 100644
index 0000000..591bef9
--- /dev/null
+++ b/src/main/java/org/springblade/common/config/FileConfig.java
@@ -0,0 +1,43 @@
+package org.springblade.common.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+/**
+ *Jun 12, 2019
+ *
+ * FileConfig.java
+ */
+@ConfigurationProperties(prefix = "upload")
+@Component
+@Order
+public class FileConfig {
+
+	public static String localtion;
+	public static String maxFileSize;
+	public static String maxRequestSize;
+
+	/**
+	 * @param localtion the localtion to set
+	 */
+	public void setLocaltion(String localtion) {
+		FileConfig.localtion = localtion;
+	}
+
+	/**
+	 * @param maxFileSize the maxFileSize to set
+	 */
+	public void setMaxFileSize(String maxFileSize) {
+		FileConfig.maxFileSize = maxFileSize;
+	}
+
+	/**
+	 * @param maxRequestSize the maxRequestSize to set
+	 */
+	public void setMaxRequestSize(String maxRequestSize) {
+		FileConfig.maxRequestSize = maxRequestSize;
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/common/utils/FileUtil.java b/src/main/java/org/springblade/common/utils/FileUtil.java
new file mode 100644
index 0000000..11ea7c9
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/FileUtil.java
@@ -0,0 +1,187 @@
+package org.springblade.common.utils;
+
+import java.io.*;
+import java.nio.channels.FileChannel;
+import java.util.List;
+import net.lingala.zip4j.core.ZipFile;
+import org.springframework.mock.web.MockMultipartFile;
+import org.springframework.web.multipart.MultipartFile;
+
+public class FileUtil {
+
+	public static void clearFiles(String workspaceRootPath) {
+		File file = new File(workspaceRootPath);
+		deleteFile(file);
+	}
+
+	public static void deleteFile(File file) {
+		if (file.exists()) {
+			if (file.isDirectory()) {
+				File[] files = file.listFiles();
+				for (int i = 0; i < files.length; i++) {
+					deleteFile(files[i]);
+				}
+			}
+		}
+		file.delete();
+	}
+
+	public static void fileWrite(String str, String fileNamePath) throws IOException {
+		FileWriter writer = null;
+		try {
+			File file = new File(fileNamePath);
+			if (!file.getParentFile().exists()) {
+				file.getParentFile().mkdirs();
+				file.createNewFile();
+			}
+			writer = new FileWriter(file, true);
+			writer.write(str + System.getProperty("line.separator"));
+
+		} catch (IOException e) {
+		} finally {
+			if (writer != null) {
+				writer.close();
+			}
+		}
+	}
+
+
+	public static File mkFile(String fileName) {
+		File f = new File(fileName);
+		try {
+			if (f.exists()) {
+				f.delete();
+			}
+			f.createNewFile();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return f;
+	}
+
+
+	public static void copyDirAndFile(String oldPath, String newPath) throws IOException {
+		if (!(new File(newPath)).exists()) {
+			(new File(newPath)).mkdir();
+		}
+		File file = new File(oldPath);
+		//file name list
+		String[] filePaths = file.list();
+		for (String filePath : filePaths) {
+			String oldFullPath = oldPath + file.separator + filePath;
+			String newFullPath = newPath + file.separator + filePath;
+			File oldFile = new File(oldFullPath);
+			File newFile = new File(newFullPath);
+			if (oldFile.isDirectory()) {
+				copyDirAndFile(oldFullPath, newFullPath);
+			} else if (oldFile.isFile()) {
+				copyFile(oldFile, newFile);
+			}
+		}
+	}
+
+	public static void copyFile(File source, File dest) throws IOException {
+		FileChannel inputChannel = null;
+		FileChannel outputChannel = null;
+		try {
+			inputChannel = new FileInputStream(source).getChannel();
+			outputChannel = new FileOutputStream(dest).getChannel();
+			outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
+		} finally {
+			inputChannel.close();
+			outputChannel.close();
+		}
+	}
+
+	/**
+	 *
+	 * 解压zip 包
+	 * @author panchaoyuan
+	 * @param srcFile    Unzipped file
+	 * @param destDirPath   Unzipped destination folder
+	 * @throws RuntimeException
+	 * @throws IOException
+	 */
+	public static void unZip(MultipartFile  srcFile, String destDirPath,String savePath) throws RuntimeException, IOException {
+		File file = null;
+		InputStream ins = srcFile.getInputStream();
+		String savaPaths = savePath+srcFile.getOriginalFilename();
+		System.out.println("savaPaths = " + savaPaths);
+		file=new File(savaPaths);
+		inputStreamToFile(ins, file);
+
+		if (!file.exists()) {
+			throw new RuntimeException(file.getPath() + ",file is not found");
+		}
+		ZipFile zipFile = null;
+		try {
+			zipFile = new ZipFile(file);
+//			zipFile.setFileNameCharset("utf-8");
+			zipFile.setFileNameCharset("gbk");
+			//解压到 destDirPath
+			zipFile.extractAll(destDirPath);
+		}catch(Exception e) {
+			throw new RuntimeException("unzip error from FileUtil", e);
+		}
+	}
+
+
+	/**
+	 * 输入流转换为文件
+	 * @author panchaoyuan
+	 * @return
+	 */
+	private static void inputStreamToFile(InputStream ins, File file) {
+		try {
+			OutputStream os = new FileOutputStream(file);
+			int bytesRead = 0;
+			byte[] buffer = new byte[8192];
+			while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
+				os.write(buffer, 0, bytesRead);
+			}
+			os.close();
+			ins.close();
+		}catch(Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * 获取解压出来的图片
+	 * @author arsn
+	 * @return
+	 */
+	public List<MultipartFile> getSubFiles(String  desFile,List<MultipartFile> fileList){
+		//取出图片数据遍历
+		File file = new File(desFile);
+		File[] files = file.listFiles();
+		for (File fileIndex : files) {
+			if (!fileIndex.exists()) {
+				throw new NullPointerException("Cannot find " + fileIndex);
+			} else if (fileIndex.isFile()) {
+				try {
+					//将 file 转换为 MultipartFile
+					File file1 = new File(desFile+File.separator + fileIndex.getName());
+					FileInputStream fileInputStream = new FileInputStream(file1);
+					MockMultipartFile mockMultipartFile = null;
+					try {
+						String name = fileIndex.getName();
+						mockMultipartFile = new MockMultipartFile(name,fileInputStream);
+					} catch (IOException e) {
+						e.printStackTrace();
+					}
+					fileList.add(mockMultipartFile);
+				} catch (FileNotFoundException e) {
+					e.printStackTrace();
+				}
+			} else {
+				if (fileIndex.isDirectory()) {
+					getSubFiles(fileIndex.getAbsolutePath(),fileList);
+				}
+			}
+		}
+		return fileList;
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/apply/controller/ApplyController.java b/src/main/java/org/springblade/modules/apply/controller/ApplyController.java
index 08e8994..3055948 100644
--- a/src/main/java/org/springblade/modules/apply/controller/ApplyController.java
+++ b/src/main/java/org/springblade/modules/apply/controller/ApplyController.java
@@ -603,13 +603,14 @@
 
 
 	/**
-	 * 生成试卷,报名
+	 * 生成考试,报名
 	 * @param ids 报名ids
 	 */
 	@PostMapping("/batchExam")
 	public R batchExam(@RequestParam String ids,
 					   String examTime,
 					   @RequestParam Date startTime,
+					   @RequestParam Integer number,
 					   Date endTime){
 		if (!ids.equals("")){
 			List<String> list = Arrays.asList(ids.split(","));
@@ -653,7 +654,7 @@
 
 		}else {
 			//查询已报名未关联试卷的人员
-			List<Long> applyIds = applyService.getApplyIds();
+			List<Long> applyIds = applyService.getApplyIds(number);
 			if (applyIds.size()>0){
 				//生成考试
 				ExamPaper examPaper = new ExamPaper();
diff --git a/src/main/java/org/springblade/modules/apply/mapper/ApplyMapper.java b/src/main/java/org/springblade/modules/apply/mapper/ApplyMapper.java
index f0ec512..304230d 100644
--- a/src/main/java/org/springblade/modules/apply/mapper/ApplyMapper.java
+++ b/src/main/java/org/springblade/modules/apply/mapper/ApplyMapper.java
@@ -88,7 +88,7 @@
 	 * 查询报名人员未关联考试的ids集合
 	 * @return
 	 */
-    List<Long> getApplyIds();
+    List<Long> getApplyIds(@Param("number") Integer number);
 
 	/**
 	 * 查询考试人数
diff --git a/src/main/java/org/springblade/modules/apply/mapper/ApplyMapper.xml b/src/main/java/org/springblade/modules/apply/mapper/ApplyMapper.xml
index 874d340..a3dc84b 100644
--- a/src/main/java/org/springblade/modules/apply/mapper/ApplyMapper.xml
+++ b/src/main/java/org/springblade/modules/apply/mapper/ApplyMapper.xml
@@ -229,6 +229,7 @@
         and sa.apply_status = 2
         and bu.is_apply = 1
         and sa.exam_id is null
+        limit 0,#{number}
     </select>
 
     <!--查询考试人数-->
diff --git a/src/main/java/org/springblade/modules/apply/service/ApplyService.java b/src/main/java/org/springblade/modules/apply/service/ApplyService.java
index a85d818..56aa3a2 100644
--- a/src/main/java/org/springblade/modules/apply/service/ApplyService.java
+++ b/src/main/java/org/springblade/modules/apply/service/ApplyService.java
@@ -88,7 +88,7 @@
 	 * 查询报名人员未关联考试的ids集合
 	 * @return
 	 */
-	List<Long> getApplyIds();
+	List<Long> getApplyIds(Integer number);
 
 	/**
 	 * 查询报名清册信息
diff --git a/src/main/java/org/springblade/modules/apply/service/impl/ApplyServiceImpl.java b/src/main/java/org/springblade/modules/apply/service/impl/ApplyServiceImpl.java
index c2ec3d2..800b7fe 100644
--- a/src/main/java/org/springblade/modules/apply/service/impl/ApplyServiceImpl.java
+++ b/src/main/java/org/springblade/modules/apply/service/impl/ApplyServiceImpl.java
@@ -394,8 +394,8 @@
 	 * @return
 	 */
 	@Override
-	public List<Long> getApplyIds() {
-		return baseMapper.getApplyIds();
+	public List<Long> getApplyIds(Integer number) {
+		return baseMapper.getApplyIds(number);
 	}
 
 	/**
diff --git a/src/main/java/org/springblade/modules/desk/controller/NoticeController.java b/src/main/java/org/springblade/modules/desk/controller/NoticeController.java
index 29dcb55..9fbbe76 100644
--- a/src/main/java/org/springblade/modules/desk/controller/NoticeController.java
+++ b/src/main/java/org/springblade/modules/desk/controller/NoticeController.java
@@ -90,7 +90,7 @@
 	/**
 	 * 多表联合查询自定义分页
 	 */
-	@GetMapping("/page")
+		@GetMapping("/page")
 	@ApiImplicitParams({
 		@ApiImplicitParam(name = "category", value = "公告类型", paramType = "query", dataType = "integer"),
 		@ApiImplicitParam(name = "title", value = "公告标题", paramType = "query", dataType = "string")
diff --git a/src/main/java/org/springblade/modules/desk/mapper/NoticeMapper.xml b/src/main/java/org/springblade/modules/desk/mapper/NoticeMapper.xml
index 00f7163..83516a1 100644
--- a/src/main/java/org/springblade/modules/desk/mapper/NoticeMapper.xml
+++ b/src/main/java/org/springblade/modules/desk/mapper/NoticeMapper.xml
@@ -49,12 +49,6 @@
         ( SELECT * FROM blade_dict WHERE code = 'notice' ) d
         ON
         n.category = d.dict_key
-        <if test="notice.deptId!=null and notice.jurisdiction!=null">
-            left join
-            blade_user bu
-            on
-            bu.dept_id = n.dept_id
-        </if>
         WHERE
         n.is_deleted = 0
         <if test="notice.title!=null">
@@ -66,15 +60,8 @@
         <if test="notice.type!=null">
             and n.type = #{notice.type}
         </if>
-        <if test="notice.deptId!=null and notice.jurisdiction!=null">
-            and (n.dept_id = #{notice.deptId} or bu.jurisdiction = #{notice.jurisdiction}
-            or n.dept_id = 1123598813738675201
-            )
-        </if>
-        <if test="notice.deptId!=null and notice.jurisdiction==null">
-            and (n.dept_id = #{notice.deptId} and n.category=2
-            or n.dept_id = 1123598813738675201
-            )
+        <if test="notice.deptId!=null and notice.deptId!=''">
+            and n.dept_id = #{notice.deptId}
         </if>
         <if test="notice.startTime!=null and notice.startTime!=''">
             and n.release_time &gt;= #{notice.startTime}
diff --git a/src/main/java/org/springblade/modules/resource/endpoint/OssEndpoint.java b/src/main/java/org/springblade/modules/resource/endpoint/OssEndpoint.java
index 7ddbf07..158c772 100644
--- a/src/main/java/org/springblade/modules/resource/endpoint/OssEndpoint.java
+++ b/src/main/java/org/springblade/modules/resource/endpoint/OssEndpoint.java
@@ -16,40 +16,31 @@
  */
 package org.springblade.modules.resource.endpoint;
 
-import com.alibaba.fastjson.JSON;
 import io.minio.*;
 import io.minio.errors.*;
 import io.swagger.annotations.Api;
+import javafx.scene.Parent;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
-import org.apache.http.HttpEntity;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.ContentType;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.util.EntityUtils;
+import org.springblade.common.config.FileConfig;
 import org.springblade.common.constant.FtpConstant;
-import org.springblade.common.utils.arg;
+import org.springblade.common.utils.FileUtil;
 import org.springblade.core.launch.constant.AppConstant;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.oss.model.OssFile;
-import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.annotation.PreAuth;
-import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tenant.annotation.NonDS;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.constant.RoleConstant;
-import org.springblade.core.tool.utils.FileUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.modules.FTP.FtpUtil;
 import org.springblade.modules.resource.builder.oss.OssBuilder;
 import org.springblade.modules.resource.entity.Attach;
 import org.springblade.modules.resource.service.IAttachService;
+import org.springblade.modules.system.entity.User;
+import org.springblade.modules.system.service.IUserService;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
-
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
@@ -57,10 +48,8 @@
 import java.security.InvalidKeyException;
 import java.security.NoSuchAlgorithmException;
 import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.UUID;
+import java.util.*;
+import java.util.regex.Pattern;
 
 import static org.springblade.common.constant.FtpConstant.*;
 
@@ -85,6 +74,9 @@
 	 * 附件表服务
 	 */
 	private final IAttachService attachService;
+
+
+	private final IUserService userService;
 
 	/**
 	 * 创建存储桶
@@ -280,6 +272,104 @@
 
 
 	/**
+	 * 文件上传,zip
+	 *
+	 * @param file 图片对象
+	 */
+	@PostMapping("put-file-zip")
+	public R putFileZip(@RequestParam MultipartFile file) throws Exception {
+		Map<String, Object> map = new HashMap<>(1);
+		//填写你文件上传的地址以及相应信息
+		String url = "http://223.82.109.183:2081";
+		String access = "zhbaadmin";
+		String secret = "zhbapassword";
+		String bucket = "zhba";
+		MinioClient minioClient =
+			MinioClient.builder()
+				.endpoint(url)
+				.credentials(access, secret)
+				.build();
+		// 检查存储桶是否已经存在
+		boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build());
+		if (!isExist) {
+			// 创建一个名为zip的存储桶,用于zip文件。
+			minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build());
+			minioClient.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucket).build());
+		}
+		String fileName = file.getOriginalFilename();
+		String namePath = fileName.substring(0,fileName.lastIndexOf("."));
+		String fileType = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(Locale.US);
+		//判断文件是不是zip类型
+		if(!fileType.equals("zip")){
+			map.put("data","上传文件类型不符!");
+			return R.data(map);
+		}
+		//FileConfig.localtion是配置文件和config类生产的,测试demo可以直接把FileConfig.localtion替换成D:/test
+		String uuid = UUID.randomUUID().toString();
+		String desPath = FileConfig.localtion + File.separator + uuid.replaceAll("-", "");
+//		String desPath = "D:/test" + File.separator + uuid.replaceAll("-", "");
+
+		//遗漏了这个代码,在本地测试环境不会出问题,在服务器上一定会报没有找到文件的错误
+		String savePath = FileConfig.localtion + File.separator;
+		FileUtil fileUtil = new FileUtil();
+		//解压zip文件
+		FileUtil.unZip(file, desPath,savePath);
+
+		List<MultipartFile> fileList = new ArrayList<>();
+		//获取图片文件
+		fileList = fileUtil.getSubFiles(desPath+File.separator+namePath,fileList);
+		for (MultipartFile multipartFile : fileList){
+			if(multipartFile.getName().toLowerCase().endsWith(".png") || multipartFile.getName().toLowerCase().endsWith(".jpg")) {
+				String newName = "upload/picture/" + UUID.randomUUID().toString().replaceAll("-", "") + multipartFile.getName().substring(multipartFile.getName().lastIndexOf("."));
+				InputStream in = multipartFile.getInputStream();
+				String[] split = newName.split("/");
+				//创建头部信息
+				Map<String, String> headers = new HashMap<>(1 << 2);
+				//添加自定义内容类型
+				headers.put("Content-Type", "application/octet-stream");
+				//上传
+				minioClient.putObject(
+					PutObjectArgs.builder().bucket(bucket).object(newName).stream(
+						in, in.available(), -1)
+						.headers(headers)
+						.build());
+
+				String urls = "http://223.82.109.183:2081/zhba/" + newName;
+				//取出身份证号,查询用户信息,更新用户信息
+				String pictrueName = multipartFile.getName().substring(0, multipartFile.getName().lastIndexOf("."));
+//				String regex ="([1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx])|([1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3})";
+				String regex ="[\u4e00-\u9fa5]";
+				Pattern compile = Pattern.compile(regex);
+				String idCardNo = compile.matcher(pictrueName).replaceAll("");
+				User user = userService.getUserInfoByIdCardNo(idCardNo);
+				//设置用户头像url
+				if (null!=user){
+					user.setAvatar(urls);
+					//更新用户信息
+					userService.updateById(user);
+
+					//内网数据推送
+					//数据推送
+					String s = "update blade_user set avatar = " + "'" + urls + "'" + "where id = " + "'" + user.getId() + "'";
+					FtpUtil.sqlFileUpload(s);
+
+					//文件推送
+					InputStream inputStream = multipartFile.getInputStream();
+					FtpUtil.uploadFile(ftpHost_dev, ftpPort, ftpUserName, ftpPassword, ftpPath, "/", split[2], inputStream);
+					in.close();
+				}
+			}
+		}
+		//最后要删除文件
+		FileUtil.clearFiles(desPath);
+		//数据封装
+		map.put("data", "上传成功!");
+		//返回
+		return R.data(map);
+	}
+
+
+	/**
 	 * 文件上传,自定义上传
 	 *
 	 * @param file 图片对象
@@ -387,7 +477,7 @@
 	 */
 	private Long buildAttach(String fileName, Long fileSize, BladeFile bladeFile, String deptid, String type, Long noticeId, String cardid, InputStream in) throws Exception {
 		//BladeUser user = AuthUtil.getUser();
-		String fileExtension = FileUtil.getFileExtension(fileName);
+		String fileExtension = org.springblade.core.tool.utils.FileUtil.getFileExtension(fileName);
 		Attach attach = new Attach();
 		attach.setDomain(bladeFile.getDomain());
 		attach.setLink(bladeFile.getLink());
diff --git a/src/main/java/org/springblade/modules/system/mapper/UserMapper.xml b/src/main/java/org/springblade/modules/system/mapper/UserMapper.xml
index f6f3468..785194e 100644
--- a/src/main/java/org/springblade/modules/system/mapper/UserMapper.xml
+++ b/src/main/java/org/springblade/modules/system/mapper/UserMapper.xml
@@ -299,30 +299,39 @@
 
     <!--保安员列表树 安员列表树,帅选无保安证,下拉tree-->
     <select id="getSecurityApplyTree" resultType="org.springblade.modules.system.node.TreeNode">
-        (select #{user.deptId} as id,
-            '全部' as name,
-            0 as parentId
-            from blade_user)
+        (
+            select #{user.deptId} as id,
+                '全部' as name,
+                0 as parentId
+                from blade_user
+        )
 
         union all
 
-        (select
-            bu.id,
-            bu.real_name as name,
-            #{user.deptId} parentId
-        from
-            blade_user bu
-        left join
-        blade_dept bd
-        on
-        bu.dept_id = bd.id
-        where
-        bu.is_deleted = 0
-        and
-        bd.dept_category = 1
-        and
-        (hold = 2 or hold = 3)
-        and bd.id = #{user.deptId}
+        (
+            select
+                distinct
+                bu.id,
+                bu.real_name as name,
+                #{user.deptId} parentId
+            from
+                blade_user bu
+            left join
+            blade_dept bd
+            on
+            bu.dept_id = bd.id
+            where
+            bu.is_deleted = 0
+            and bu.status = 1
+            and bd.dept_category = 1
+            and (hold = 2 or hold = 3)
+            and bd.id = #{user.deptId}
+            <if test="user.examType==1">
+                and bu.is_apply != 1
+            </if>
+            <if test="user.examType==2">
+                and bu.is_train != 1
+            </if>
         )
     </select>
 
diff --git a/src/main/java/org/springblade/modules/system/vo/UserVO.java b/src/main/java/org/springblade/modules/system/vo/UserVO.java
index b0ece4b..ee13f63 100644
--- a/src/main/java/org/springblade/modules/system/vo/UserVO.java
+++ b/src/main/java/org/springblade/modules/system/vo/UserVO.java
@@ -112,5 +112,10 @@
 	 */
 	private Integer age;
 
+	/**
+	 * 考试类型  1:正式考试   2:模拟考试
+	 */
+	private Integer examType;
+
 
 }
diff --git a/src/main/java/org/springblade/modules/training/controller/TrainingRegistrationController.java b/src/main/java/org/springblade/modules/training/controller/TrainingRegistrationController.java
index 2a3789f..f409eb3 100644
--- a/src/main/java/org/springblade/modules/training/controller/TrainingRegistrationController.java
+++ b/src/main/java/org/springblade/modules/training/controller/TrainingRegistrationController.java
@@ -457,11 +457,14 @@
 	/**
 	 * 生成试卷,报名
 	 * @param ids 报名ids
+	 * @param startTime 考试开始时间
+	 * @param number 报名人数
 	 */
 	@PostMapping("/batchExam")
 	public R batchExam(@RequestParam String ids,
 					   String examTime,
 					   @RequestParam Date startTime,
+					   @RequestParam Integer number,
 					   Date endTime){
 		if (!ids.equals("")){
 			List<String> list = Arrays.asList(ids.split(","));
@@ -506,52 +509,56 @@
 					FtpUtil.sqlFileUpload(s1);
 				});
 			}
-
 		}else {
-			//查询已报名未关联试卷的人员
-			List<Long> applyIds = trainingRegistrationService.getTrainIds();
-			if (applyIds.size()>0){
-				//生成考试
-				ExamPaper examPaper = new ExamPaper();
+			if (number==0){
+				return R.data("报名人数不能小于1人");
+			}else {
+				//查询已报名的人员前 number 个
+				//查询已报名未关联试卷的人员
+				List<Long> applyIds = trainingRegistrationService.getTrainIds(number);
+				if (applyIds.size()>0){
+					//生成考试
+					ExamPaper examPaper = new ExamPaper();
 //				examPaper.setExamTime(examTime);
-				examPaper.setExamType(2);
-				examPaper.setStartTime(startTime);
+					examPaper.setExamType(2);
+					examPaper.setStartTime(startTime);
 //				examPaper.setEndTime(endTime);
-				Calendar instance = Calendar.getInstance();
-				instance.setTime(startTime);
-				int year = instance.get(Calendar.YEAR);
-				int month = instance.get(Calendar.MONTH)+1;
-				int day = instance.get(Calendar.DAY_OF_MONTH);
-				String examName = year + "年" + month+ "月"+ day +"日" +"保安员证模拟考试";
-				examPaper.setExamName(examName);
-				//待审核
-				examPaper.setAuditStatus(3);
-				//生成考试
-				examPaperService.save(examPaper);
+					Calendar instance = Calendar.getInstance();
+					instance.setTime(startTime);
+					int year = instance.get(Calendar.YEAR);
+					int month = instance.get(Calendar.MONTH)+1;
+					int day = instance.get(Calendar.DAY_OF_MONTH);
+					String examName = year + "年" + month+ "月"+ day +"日" +"保安员证模拟考试";
+					examPaper.setExamName(examName);
+					//待审核
+					examPaper.setAuditStatus(3);
+					//生成考试
+					examPaperService.save(examPaper);
 
-				Long sid = examPaper.getId();
-				String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(examPaper.getStartTime());
-				String s = "insert into ksxt_exam(id,exam_name,exam_type,start_time,audit_status) " +
-					"values(" + "'" + sid + "'" +
-					"," + "'" + examPaper.getExamName() + "'" +
-					"," + "'" + examPaper.getExamType() +"'" +
-					"," + "'" + format +"'" +
-					","  +"'" + examPaper.getAuditStatus() + "'" + ")";
-				FtpUtil.sqlFileUpload(s);
+					Long sid = examPaper.getId();
+					String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(examPaper.getStartTime());
+					String s = "insert into ksxt_exam(id,exam_name,exam_type,start_time,audit_status) " +
+						"values(" + "'" + sid + "'" +
+						"," + "'" + examPaper.getExamName() + "'" +
+						"," + "'" + examPaper.getExamType() +"'" +
+						"," + "'" + format +"'" +
+						","  +"'" + examPaper.getAuditStatus() + "'" + ")";
+					FtpUtil.sqlFileUpload(s);
 
 
-				//修改报名信息
-				applyIds.forEach(id ->{
-					TrainingRegistration trainingRegistration = new TrainingRegistration();
-					trainingRegistration.setId(id);
-					trainingRegistration.setTrainExamId(examPaper.getId().toString());
-					trainingRegistrationService.updateById(trainingRegistration);
+					//修改报名信息
+					applyIds.forEach(id ->{
+						TrainingRegistration trainingRegistration = new TrainingRegistration();
+						trainingRegistration.setId(id);
+						trainingRegistration.setTrainExamId(examPaper.getId().toString());
+						trainingRegistrationService.updateById(trainingRegistration);
 
-					String s1 =
-						"update sys_training_registration set train_exam_id = " + "'" + trainingRegistration.getTrainExamId()+ "'"
-							+ " " +"where id = " + "'" + trainingRegistration.getId() + "'";
-					FtpUtil.sqlFileUpload(s1);
-				});
+						String s1 =
+							"update sys_training_registration set train_exam_id = " + "'" + trainingRegistration.getTrainExamId()+ "'"
+								+ " " +"where id = " + "'" + trainingRegistration.getId() + "'";
+						FtpUtil.sqlFileUpload(s1);
+					});
+				}
 			}
 		}
 		return null;
diff --git a/src/main/java/org/springblade/modules/training/mapper/TrainingRegistrationMapper.java b/src/main/java/org/springblade/modules/training/mapper/TrainingRegistrationMapper.java
index 47bc2a3..e397191 100644
--- a/src/main/java/org/springblade/modules/training/mapper/TrainingRegistrationMapper.java
+++ b/src/main/java/org/springblade/modules/training/mapper/TrainingRegistrationMapper.java
@@ -57,5 +57,5 @@
 	 * 查询已报名培训公司未关联考试的人员
 	 * @return
 	 */
-    List<Long> getTrainIds();
+    List<Long> getTrainIds(@Param("number") Integer number);
 }
diff --git a/src/main/java/org/springblade/modules/training/mapper/TrainingRegistrationMapper.xml b/src/main/java/org/springblade/modules/training/mapper/TrainingRegistrationMapper.xml
index 821922c..d1867fb 100644
--- a/src/main/java/org/springblade/modules/training/mapper/TrainingRegistrationMapper.xml
+++ b/src/main/java/org/springblade/modules/training/mapper/TrainingRegistrationMapper.xml
@@ -50,7 +50,7 @@
             and bu.real_name like concat('%', #{trainingRegistration.realName},'%')
         </if>
         <if test="trainingRegistration.cancel!=null">
-            and sr.cancel = #{trainingRegistration.cancel}
+            and (sr.training_unit_id is null or ke.audit_status = 3)
         </if>
     </select>
 
@@ -154,11 +154,16 @@
         blade_user bu
         on
         str.user_id = bu.id
+        left join
+            ksxt_exam ke
+        on
+            ke.id = str.train_exam_id
         WHERE
         1=1
         and str.is_exam = 1
         and str.cancel = 1
         and bu.is_train = 1
-        and str.train_exam_id is null
+        and (str.train_exam_id is null or ke.audit_status = 3)
+        limit 0,#{number}
     </select>
 </mapper>
diff --git a/src/main/java/org/springblade/modules/training/service/TrainingRegistrationService.java b/src/main/java/org/springblade/modules/training/service/TrainingRegistrationService.java
index df5a0ef..b50605c 100644
--- a/src/main/java/org/springblade/modules/training/service/TrainingRegistrationService.java
+++ b/src/main/java/org/springblade/modules/training/service/TrainingRegistrationService.java
@@ -61,5 +61,5 @@
 	 * 查询已报名培训公司未关联考试的人员
 	 * @return
 	 */
-    List<Long> getTrainIds();
+    List<Long> getTrainIds(Integer number);
 }
diff --git a/src/main/java/org/springblade/modules/training/service/impl/TrainingRegistrationServiceImpl.java b/src/main/java/org/springblade/modules/training/service/impl/TrainingRegistrationServiceImpl.java
index 07eda97..d8916ef 100644
--- a/src/main/java/org/springblade/modules/training/service/impl/TrainingRegistrationServiceImpl.java
+++ b/src/main/java/org/springblade/modules/training/service/impl/TrainingRegistrationServiceImpl.java
@@ -261,7 +261,7 @@
 	 * @return
 	 */
 	@Override
-	public List<Long> getTrainIds() {
-		return baseMapper.getTrainIds();
+	public List<Long> getTrainIds(Integer number) {
+		return baseMapper.getTrainIds(number);
 	}
 }
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index ee29b81..7ca2472 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -53,3 +53,9 @@
     upload-domain: http://localhost:8999
     remote-path: /usr/share/nginx/html
 
+upload:
+#  localtion: ${UPLOAD_DIR:/home/zhongsong/anbao}
+  localtion: ${UPLOAD_DIR:D:/test}
+  maxFileSize: 10240KB
+  maxRequestSize: 102400KB
+

--
Gitblit v1.9.3