فهرست منبع

Merge branch 'dev_v2.2.1' of http://git.qmth.com.cn/wangliang/distributed-print-service into dev_v2.2.1

xiaof 3 سال پیش
والد
کامیت
ac44fbf527

+ 6 - 7
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TSyncExamStudentScore.java

@@ -99,9 +99,8 @@ public class TSyncExamStudentScore implements Serializable {
     @ApiModelProperty(value = "轨迹图是否生成,1:已生成,0:未生成")
     private Boolean trajectory;
 
-    @ApiModelProperty(value = "轨迹图附件")
-    @JsonSerialize(using = ToStringSerializer.class)
-    private Long attachmentId;
+    @ApiModelProperty(value = "轨迹图地址")
+    private String trajectoryUrls;
 
     @ApiModelProperty(value = "创建人id")
     @JsonSerialize(using = ToStringSerializer.class)
@@ -306,12 +305,12 @@ public class TSyncExamStudentScore implements Serializable {
         this.trajectory = trajectory;
     }
 
-    public Long getAttachmentId() {
-        return attachmentId;
+    public String getTrajectoryUrls() {
+        return trajectoryUrls;
     }
 
-    public void setAttachmentId(Long attachmentId) {
-        this.attachmentId = attachmentId;
+    public void setTrajectoryUrls(String trajectoryUrls) {
+        this.trajectoryUrls = trajectoryUrls;
     }
 
     public Long getCreateId() {

+ 65 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncScoreBatchDownloadService.java

@@ -0,0 +1,65 @@
+package com.qmth.distributed.print.business.templete.execute;
+
+import cn.hutool.core.date.DateUtil;
+import com.qmth.boot.api.exception.ApiException;
+import com.qmth.distributed.print.business.templete.export.AsyncExportTaskTemplete;
+import com.qmth.distributed.print.business.templete.service.TaskLogicService;
+import com.qmth.teachcloud.common.contant.SpringContextHolder;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.TBTask;
+import com.qmth.teachcloud.common.enums.TaskResultEnum;
+import com.qmth.teachcloud.common.enums.TaskStatusEnum;
+import com.qmth.teachcloud.common.service.TBTaskService;
+import com.qmth.teachcloud.common.util.Result;
+import com.qmth.teachcloud.common.util.ResultUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import java.text.MessageFormat;
+import java.util.Date;
+import java.util.Map;
+import java.util.StringJoiner;
+
+/**
+ * @Description: 成绩批量下载
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/11/1
+ */
+@Service
+public class AsyncScoreBatchDownloadService extends AsyncExportTaskTemplete {
+
+    public static final String OBJ_TITLE = "成绩轨迹";
+    private final static Logger log = LoggerFactory.getLogger(AsyncScoreBatchDownloadService.class);
+
+    @Override
+    public Result exportTask(Map<String, Object> map) {
+        TBTask tbTask = (TBTask) map.get(SystemConstant.TASK);
+        StringJoiner stringJoinerSummary = new StringJoiner("\n")
+                .add(MessageFormat.format("{0}{1}{2}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), BEGIN_TITLE, OBJ_TITLE));
+        tbTask.setStatus(TaskStatusEnum.RUNNING);
+        TBTaskService tbTaskService = SpringContextHolder.getBean(TBTaskService.class);
+        tbTaskService.updateById(tbTask);
+        try {
+            TaskLogicService taskLogicService = SpringContextHolder.getBean(TaskLogicService.class);
+            Map<String, Object> result = taskLogicService.executeDownloadScoreLogic(map);
+            stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), FINISH_TITLE, Long.valueOf(String.valueOf(result.get("count"))), FINISH_SIZE));
+            tbTask.setResult(TaskResultEnum.SUCCESS);
+        } catch (Exception e) {
+            log.error("请求出错", e);
+            stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), 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();
+    }
+}

+ 8 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/TaskLogicService.java

@@ -115,4 +115,12 @@ public interface TaskLogicService {
      * @return
      */
     Map<String, Object> executeExportScoreLogic(Map<String, Object> map) throws Exception;
+
+    /**
+     * 成绩轨迹下载
+     *
+     * @param map
+     * @return
+     */
+    Map<String, Object> executeDownloadScoreLogic(Map<String, Object> map) throws Exception;
 }

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

@@ -1440,6 +1440,88 @@ public class TaskLogicServiceImpl implements TaskLogicService {
         return map;
     }
 
+    /**
+     * 成绩轨迹下载
+     *
+     * @param map
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Map<String, Object> executeDownloadScoreLogic(Map<String, Object> map) throws Exception {
+        try {
+            SysUser sysUser = (SysUser) map.get(SystemConstant.USER);
+            Long semesterId = null, orgId = null, majorId = null, clazzId = null;
+            String courseCode = null;
+            semesterId = Objects.nonNull(map.get("semesterId")) ? (Long) map.get(semesterId) : null;
+            orgId = Objects.nonNull(map.get("orgId")) ? (Long) map.get(orgId) : null;
+            majorId = Objects.nonNull(map.get("majorId")) ? (Long) map.get("majorId") : null;
+            clazzId = Objects.nonNull(map.get("clazzId")) ? (Long) map.get("clazzId") : null;
+            courseCode = Objects.nonNull(map.get("courseCode")) ? (String) map.get("courseCode") : null;
+
+            List<TSyncExamStudentScoreResult> tSyncExamStudentScoreResultList = tSyncExamStudentScoreService.export(sysUser.getSchoolId(), semesterId, orgId, majorId, clazzId, courseCode);
+            if (Objects.nonNull(tSyncExamStudentScoreResultList) && tSyncExamStudentScoreResultList.size() > 0) {
+                LocalDateTime nowTime = LocalDateTime.now();
+                StringJoiner stringJoiner = new StringJoiner("");
+                stringJoiner.add(SystemConstant.TEMP_FILES_DIR).add(File.separator);
+                StringJoiner dirZipName = new StringJoiner("");
+                dirZipName.add(UploadFileEnum.FILE.getTitle()).add(File.separator)
+                        .add(String.valueOf(nowTime.getYear())).add(File.separator)
+                        .add(String.format("%02d", nowTime.getMonthValue())).add(File.separator)
+                        .add(String.format("%02d", nowTime.getDayOfMonth()))
+                        .add(File.separator).add(SystemConstant.getUuid()).add(SystemConstant.ZIP_PREFIX);
+                File zipFile = new File(stringJoiner.toString() + dirZipName.toString());
+                if (!zipFile.getParentFile().exists()) {
+                    zipFile.getParentFile().mkdirs();
+                    zipFile.createNewFile();
+                }
+                List<File> sourceFiles = new ArrayList<>();
+
+                for (TSyncExamStudentScoreResult t : tSyncExamStudentScoreResultList) {
+                    if (Objects.nonNull(t.getTrajectoryUrls())) {
+                        sourceFiles.add(fileStoreUtil.ossDownload(t.getTrajectoryUrls(), stringJoiner.toString() + t.getTrajectoryUrls(), UploadFileEnum.FILE.getFssType()));
+                    } else {
+                        if (Objects.nonNull(t.getSheetUrls())) {
+                            String format = t.getSheetUrls().substring(t.getSheetUrls().lastIndexOf("."), t.getSheetUrls().length());
+                            File file = new File(t.getSheetUrls());
+                            StringJoiner dirImageName = new StringJoiner("");
+                            dirImageName.add(UploadFileEnum.FILE.getTitle()).add(File.separator);
+                            dirImageName.add(String.valueOf(nowTime.getYear())).add(File.separator)
+                                    .add(String.format("%02d", nowTime.getMonthValue())).add(File.separator)
+                                    .add(String.format("%02d", nowTime.getDayOfMonth()))
+                                    .add(File.separator).add(SystemConstant.getUuid()).add(format);
+                            File fileTarget = new File(stringJoiner.toString() + dirImageName.toString());
+                            ImageTrajectoryUtil.createImage(file, fileTarget, 10, 10);
+                            sourceFiles.add(fileTarget);
+                            fileStoreUtil.ossUpload(dirImageName.toString(), fileTarget, DigestUtils.md5Hex(new FileInputStream(fileTarget)), UploadFileEnum.FILE.getFssType());
+                            t.setTrajectoryUrls(dirImageName.toString());
+                        }
+                    }
+                }
+                FileUtil.doZip(zipFile, sourceFiles);
+
+                boolean oss = (boolean) map.get(SystemConstant.OSS);
+                JSONObject jsonObject = new JSONObject();
+                if (oss) {//上传至oss
+                    fileStoreUtil.ossUpload(dirZipName.toString(), zipFile, DigestUtils.md5Hex(new FileInputStream(zipFile)), UploadFileEnum.FILE.getFssType());
+                    jsonObject.put(SystemConstant.TYPE, SystemConstant.OSS);
+                    jsonObject.put(SystemConstant.PATH, dirZipName.toString());
+                } else {
+                    jsonObject.put(SystemConstant.TYPE, SystemConstant.LOCAL);
+                    jsonObject.put(SystemConstant.PATH, stringJoiner.toString() + dirZipName.toString());
+                }
+                fileStoreUtil.ossUpload(dirZipName.toString(), zipFile, DigestUtils.md5Hex(new FileInputStream(zipFile)), UploadFileEnum.FILE.getFssType());
+                TBTask tbTask = (TBTask) map.get(SystemConstant.TASK);
+                tbTask.setResultFilePath(jsonObject.toJSONString());
+            }
+            map.computeIfAbsent("count", v -> Objects.isNull(tSyncExamStudentScoreResultList) ? 0 : tSyncExamStudentScoreResultList.size());
+        } catch (Exception e) {
+            log.error("请求出错", e);
+            e.printStackTrace();
+        }
+        return map;
+    }
+
 
     public String createTempNumber(SerialNumberParams serialNumberParams) {
         return convertUtil.getIncre(serialNumberParams.getPrefix(), serialNumberParams.getModel(), serialNumberParams.getDigit());

+ 1 - 9
distributed-print-business/src/main/resources/mapper/TSyncExamStudentScoreMapper.xml

@@ -26,15 +26,7 @@
             tsess.sheet_urls as sheetUrls,
             tsess.status,
             tsess.trajectory,
-            IF(tsess.attachment_id = null,
-            null,
-            (
-            select
-                ba.`path`
-            from
-                basic_attachment ba
-            where
-                ba.id = tsess.attachment_id)) as trajectoryUrls,
+            tsess.trajectory_urls as trajectoryUrls,
             tsess.sync_data as trajectoryCoordinate,
             tsess.create_time as syncTime
         from

+ 1 - 1
distributed-print/src/main/java/com/qmth/distributed/print/api/MenuCustomController.java

@@ -65,7 +65,7 @@ public class MenuCustomController {
     public Result rolePrivilegeCountSync() {
         QueryWrapper<SysPrivilege> sysPrivilegeQueryWrapper = new QueryWrapper<>();
         sysPrivilegeQueryWrapper.lambda().eq(SysPrivilege::getEnable, true)
-                .eq(SysPrivilege::getDisplay, true)
+                .eq(SysPrivilege::getEnable, true)
                 .eq(SysPrivilege::getDefaultAuth, false)
                 .ne(SysPrivilege::getType, PrivilegeEnum.URL)
                 .notIn(SysPrivilege::getId, SystemConstant.MENU_MANAGE);

+ 0 - 3
distributed-print/src/main/java/com/qmth/distributed/print/api/SysController.java

@@ -72,9 +72,6 @@ public class SysController {
     @Resource
     BasicAttachmentService basicAttachmentService;
 
-    @Autowired
-    private SysConfigService sysConfigService;
-
     @Autowired
     private SysUserRoleService sysUserRoleService;
 

+ 68 - 3
distributed-print/src/main/java/com/qmth/distributed/print/api/TSyncExamStudentScoreController.java

@@ -1,24 +1,35 @@
 package com.qmth.distributed.print.api;
 
 
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.boot.api.annotation.Aac;
 import com.qmth.boot.api.annotation.BOOL;
 import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.distributed.print.business.bean.result.EditResult;
 import com.qmth.distributed.print.business.bean.result.TSyncExamStudentScoreResult;
 import com.qmth.distributed.print.business.entity.TBSyncTask;
+import com.qmth.distributed.print.business.entity.TSyncExamStudentScore;
 import com.qmth.distributed.print.business.service.PrintCommonService;
 import com.qmth.distributed.print.business.service.TSyncExamStudentScoreService;
+import com.qmth.distributed.print.business.templete.execute.AsyncScoreBatchDownloadService;
 import com.qmth.distributed.print.business.templete.execute.AsyncScoreExportService;
 import com.qmth.distributed.print.business.templete.execute.AsyncScorePushService;
 import com.qmth.teachcloud.common.config.DictionaryConfig;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.TBTask;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.PushTypeEnum;
 import com.qmth.teachcloud.common.enums.TaskTypeEnum;
+import com.qmth.teachcloud.common.enums.UploadFileEnum;
+import com.qmth.teachcloud.common.service.TeachcloudCommonService;
+import com.qmth.teachcloud.common.util.FileStoreUtil;
+import com.qmth.teachcloud.common.util.ImageTrajectoryUtil;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import io.swagger.annotations.*;
+import org.apache.commons.codec.digest.DigestUtils;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
@@ -28,8 +39,13 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.annotation.Resource;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
+import java.io.File;
+import java.io.FileInputStream;
+import java.time.LocalDateTime;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
+import java.util.StringJoiner;
 
 /**
  * <p>
@@ -61,6 +77,15 @@ public class TSyncExamStudentScoreController {
     @Resource
     AsyncScorePushService asyncScorePushService;
 
+    @Resource
+    AsyncScoreBatchDownloadService asyncScoreBatchDownloadService;
+
+    @Resource
+    TeachcloudCommonService teachcloudCommonService;
+
+    @Resource
+    FileStoreUtil fileStoreUtil;
+
     @ApiOperation(value = "成绩归档查询列表")
     @ApiResponses({@ApiResponse(code = 200, message = "成绩查询信息", response = TSyncExamStudentScoreResult.class)})
     @RequestMapping(value = "/score/list", method = RequestMethod.POST)
@@ -115,8 +140,48 @@ public class TSyncExamStudentScoreController {
     @ApiOperation(value = "成绩动态轨迹图下载")
     @ApiResponses({@ApiResponse(code = 200, message = "常规信息", response = Result.class)})
     @RequestMapping(value = "/score/download", method = RequestMethod.POST)
-    public Result download(@ApiParam(value = "考试id", required = true) @RequestParam String examStudentId) {
-        return ResultUtil.ok(true);
+    public Result download(@ApiParam(value = "考试id", required = true) @RequestParam String examStudentId) throws Exception {
+        QueryWrapper<TSyncExamStudentScore> tSyncExamStudentScoreQueryWrapper = new QueryWrapper<>();
+        tSyncExamStudentScoreQueryWrapper.lambda().eq(TSyncExamStudentScore::getExamStudentId, SystemConstant.convertIdToLong(examStudentId));
+        TSyncExamStudentScore tSyncExamStudentScore = tSyncExamStudentScoreService.getOne(tSyncExamStudentScoreQueryWrapper);
+        Optional.ofNullable(tSyncExamStudentScore).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("考生不存在"));
+
+        JSONObject jsonObject = null;
+        String path = null;
+        if (Objects.isNull(tSyncExamStudentScore.getTrajectoryUrls())) {
+            String format = tSyncExamStudentScore.getSheetUrls().substring(tSyncExamStudentScore.getSheetUrls().lastIndexOf("."), tSyncExamStudentScore.getSheetUrls().length());
+            boolean oss = dictionaryConfig.sysDomain().isOss();
+            LocalDateTime nowTime = LocalDateTime.now();
+            StringJoiner stringJoiner = new StringJoiner("");
+            stringJoiner.add(SystemConstant.TEMP_FILES_DIR).add(File.separator);
+            StringJoiner dirJpgName = new StringJoiner("");
+            dirJpgName.add(UploadFileEnum.FILE.getTitle()).add(File.separator)
+                    .add(String.valueOf(nowTime.getYear())).add(File.separator)
+                    .add(String.format("%02d", nowTime.getMonthValue())).add(File.separator)
+                    .add(String.format("%02d", nowTime.getDayOfMonth()))
+                    .add(File.separator).add(SystemConstant.getUuid()).add(format);
+            File fileTarget = new File(stringJoiner.toString() + dirJpgName.toString());
+            if (!fileTarget.exists()) {
+                fileTarget.getParentFile().mkdirs();
+                fileTarget.createNewFile();
+            }
+            File sheetFile = new File(tSyncExamStudentScore.getSheetUrls());
+            ImageTrajectoryUtil.createImage(sheetFile, fileTarget, 10, 10);
+            if (oss) {
+                fileStoreUtil.ossUpload(dirJpgName.toString(), fileTarget, DigestUtils.md5Hex(new FileInputStream(fileTarget)), UploadFileEnum.FILE.getFssType());
+                jsonObject.put(SystemConstant.TYPE, SystemConstant.OSS);
+                jsonObject.put(SystemConstant.PATH, dirJpgName.toString());
+                path = teachcloudCommonService.filePreview(dirJpgName.toString());
+            } else {
+                jsonObject.put(SystemConstant.TYPE, SystemConstant.LOCAL);
+                jsonObject.put(SystemConstant.PATH, stringJoiner.toString() + dirJpgName.toString());
+                path = stringJoiner.toString() + dirJpgName.toString();
+            }
+        } else {
+            jsonObject = JSONObject.parseObject(tSyncExamStudentScore.getTrajectoryUrls());
+            path = teachcloudCommonService.filePreview((String) jsonObject.get(SystemConstant.PATH));
+        }
+        return ResultUtil.ok(new EditResult(path));
     }
 
     @ApiOperation(value = "成绩动态轨迹图一键下载")
@@ -134,7 +199,7 @@ public class TSyncExamStudentScoreController {
         map.computeIfAbsent("clazzId", v -> SystemConstant.convertIdToLong(clazzId));
         map.computeIfAbsent("courseCode", v -> courseCode);
         map.computeIfAbsent(SystemConstant.OSS, v -> dictionaryConfig.sysDomain().isOss());
-//        asyncScoreExportService.exportTask(map);
+        asyncScoreBatchDownloadService.exportTask(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("创建任务失败");
     }

+ 12 - 12
teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/SysPrivilege.java

@@ -62,14 +62,22 @@ public class SysPrivilege implements Serializable {
     @TableField(value = "enable")
     private Boolean enable;
 
-    @ApiModelProperty(value = "是否显示,0:不显示,1:显示")
-    @TableField(value = "display")
-    private Boolean display;
-
     @ApiModelProperty(value = "默认权限,0:否,1:是")
     @TableField(value = "default_auth")
     private Boolean defaultAuth;
 
+    @ApiModelProperty(value = "是否前端展示,0:否,1:是")
+    @TableField(value = "front_display")
+    private Boolean frontDisplay;
+
+    public Boolean getFrontDisplay() {
+        return frontDisplay;
+    }
+
+    public void setFrontDisplay(Boolean frontDisplay) {
+        this.frontDisplay = frontDisplay;
+    }
+
     public Long getId() {
         return id;
     }
@@ -86,14 +94,6 @@ public class SysPrivilege implements Serializable {
         this.defaultAuth = defaultAuth;
     }
 
-    public Boolean getDisplay() {
-        return display;
-    }
-
-    public void setDisplay(Boolean display) {
-        this.display = display;
-    }
-
     public static long getSerialVersionUID() {
         return serialVersionUID;
     }

+ 0 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysPrivilegeServiceImpl.java

@@ -100,7 +100,6 @@ public class SysPrivilegeServiceImpl extends ServiceImpl<SysPrivilegeMapper, Sys
         QueryWrapper<SysPrivilege> sysPrivilegeQueryWrapper = new QueryWrapper<>();
         sysPrivilegeQueryWrapper.lambda()
                 .ne(SysPrivilege::getType, PrivilegeEnum.URL)
-                .eq(SysPrivilege::getDisplay, true)
                 .eq(SysPrivilege::getEnable, true)
                 .eq(SysPrivilege::getDefaultAuth, true);
 //        if (Objects.isNull(schoolId)) {

+ 1 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/TeachcloudCommonServiceImpl.java

@@ -111,7 +111,7 @@ public class TeachcloudCommonServiceImpl implements TeachcloudCommonService {
         }
         Set<Long> privilegeIds = sysRolePrivilegeList.stream().map(s -> s.getPrivilegeId()).collect(Collectors.toSet());
         QueryWrapper<SysPrivilege> sysPrivilegeQueryWrapper = new QueryWrapper<>();
-        sysPrivilegeQueryWrapper.lambda().in(SysPrivilege::getId, privilegeIds).eq(SysPrivilege::getEnable, true);
+        sysPrivilegeQueryWrapper.lambda().in(SysPrivilege::getId, privilegeIds).eq(SysPrivilege::getEnable, true).eq(SysPrivilege::getFrontDisplay, true);
         List<SysPrivilege> sysPrivilegeList = sysPrivilegeService.list(sysPrivilegeQueryWrapper);
         Gson gson = new Gson();
         List<MenuDto> menuDtoList = gson.fromJson(JacksonUtil.parseJson(sysPrivilegeList), new TypeToken<List<MenuDto>>() {

+ 1 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/ImageTrajectoryUtil.java

@@ -66,7 +66,7 @@ public class ImageTrajectoryUtil {
      */
     public static void main(String[] args) {
         try {
-            ImageTrajectoryUtil.createImage(new File("/Users/king/Downloads/spring.jpg"), new File("/Users/king/Downloads/spring1.jpg"), 10, 10);
+            ImageTrajectoryUtil.createImage(new File("/Users/king/Downloads/spring.jpg"), new File("/Users/king/Downloads/1.jpg"), 10, 10);
         } catch (IOException e) {
             e.printStackTrace();
         }