From 046e7e3c76ab6690d5e81566de31868257288df3 Mon Sep 17 00:00:00 2001
From: yangys <y_ys79@sina.com>
Date: 星期四, 16 十月 2025 16:54:54 +0800
Subject: [PATCH] 任务导入+翻页修复

---
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/TaskImportController.java            |   86 ++++++++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/NcProgramExportInnerService.java |    3 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excel/TaskAssignExcel.java                      |   71 ++++++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/task/controller/MachineBackTaskController.java   |   17 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/service/CuredProgramStatService.java      |    2 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchTaskController.java          |   11 -
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excel/TaskAssignImpResultExcel.java             |   80 ++++++++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/TaskImportService.java                  |  191 +++++++++++++++++++++++
 8 files changed, 446 insertions(+), 15 deletions(-)

diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchTaskController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchTaskController.java
index 38fde9b..43c0f60 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchTaskController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchTaskController.java
@@ -7,16 +7,12 @@
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.ss.usermodel.DateUtil;
-import org.flowable.engine.RuntimeService;
-import org.flowable.engine.TaskService;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.mdm.flow.entity.TaskDispatch;
 import org.springblade.mdm.flow.excution.StartDispatcher;
-import org.springblade.mdm.flow.service.FlowProgramFileService;
 import org.springblade.mdm.flow.service.TaskDispatchService;
-import org.springblade.mdm.flow.service.execute.*;
 import org.springblade.mdm.flow.vo.DispathTaskQueryVO;
 import org.springblade.mdm.flow.vo.FlowStartResult;
 import org.springblade.mdm.flow.vo.TaskAssignVO;
@@ -34,13 +30,6 @@
 
 	private final StartDispatcher dispatcher;
 
-	private final TaskService taskService;
-	private final RuntimeService runtimeService;
-	private final FlowProgramFileService flowProgramFileService;
-
-
-	private final TryFlowCompleteService tryFlowCompleteService;
-	private final DefaultFlowCompleteService defaultFlowCompleteService;
 	private final TaskDispatchService taskDispatchService;
 
 	@Operation(summary = "寮傚父浠诲姟鍒嗛〉鏌ヨ", description = "鏌ヨ鍕ゅ摬鍒嗗伐琛ㄦ暟鎹�")
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/TaskImportController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/TaskImportController.java
new file mode 100644
index 0000000..73a42d7
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/TaskImportController.java
@@ -0,0 +1,86 @@
+package org.springblade.mdm.flow.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.flowable.engine.HistoryService;
+import org.flowable.engine.TaskService;
+import org.flowable.engine.task.Comment;
+import org.flowable.task.api.history.HistoricTaskInstance;
+import org.springblade.core.excel.util.ExcelUtil;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.oss.model.BladeFile;
+import org.springblade.core.oss.model.OssFile;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.DateUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.UrlUtil;
+import org.springblade.mdm.commons.service.OssFileCommonService;
+import org.springblade.mdm.flow.excel.TaskAssignExcel;
+import org.springblade.mdm.flow.service.*;
+import org.springblade.mdm.flow.vo.FlowVO;
+import org.springblade.mdm.flow.vo.OvertimeTaskExcelVO;
+import org.springblade.mdm.flow.vo.TaskTraceVO;
+import org.springblade.system.feign.IUserClient;
+import org.springblade.system.pojo.entity.User;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+@Slf4j
+@RestController
+@RequestMapping("/flow/mgr")
+@Tag(name = "娴佺▼绠$悊", description = "娴佺▼绠$悊")
+public class TaskImportController {
+
+	@Autowired
+	private OssFileCommonService ossFileCommonService;
+	@Autowired
+	private TaskImportService taskImportService;
+
+	@PostMapping("/import-task")
+	@Operation(summary = "瀵煎叆浠诲姟", description = "excel瀵煎叆浠诲姟")
+	public R<BladeFile> importTask(MultipartFile file)  {
+		try {
+			List<TaskAssignExcel> importTaskList = ExcelUtil.read(file, TaskAssignExcel.class);
+			if(importTaskList.isEmpty()){
+				return R.fail("鏁版嵁涓虹┖");
+			}
+			BladeFile resultFile = taskImportService.importTask(importTaskList,file.getOriginalFilename());
+			return R.data(resultFile);
+		}catch(Exception e) {
+			log.error("瀵煎叆寮傚父", e);
+			return R.fail(e.getMessage());
+		}
+	}
+	@GetMapping("/download-import-result")
+	@Operation(summary = "浠诲姟瀵煎叆缁撴灉涓嬭浇", description = "浠诲姟瀵煎叆缁撴灉涓嬭浇")
+	public void downloadImportResult(String name,String originalName,HttpServletResponse response) throws IOException {
+		ossFileCommonService.download(name,originalName,response);
+	}
+
+
+	@GetMapping("/download-task-template")
+	@Operation(summary = "浠诲姟妯℃澘涓嬭浇", description = "浠诲姟妯℃澘涓嬭浇")
+	public void downloadTaskTemplate(HttpServletResponse response)  {
+		ExcelUtil.export(response,"璁″垝浠诲姟瀵煎叆妯℃澘", "浠诲姟娲惧伐",Collections.emptyList(),TaskAssignExcel.class);
+
+	}
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excel/TaskAssignExcel.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excel/TaskAssignExcel.java
new file mode 100644
index 0000000..333c579
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excel/TaskAssignExcel.java
@@ -0,0 +1,71 @@
+/**
+ * BladeX Commercial License Agreement
+ * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
+ * <p>
+ * Use of this software is governed by the Commercial License Agreement
+ * obtained after purchasing a license from BladeX.
+ * <p>
+ * 1. This software is for development use only under a valid license
+ * from BladeX.
+ * <p>
+ * 2. Redistribution of this software's source code to any third party
+ * without a commercial license is strictly prohibited.
+ * <p>
+ * 3. Licensees may copyright their own code but cannot use segments
+ * from this software for such purposes. Copyright of this software
+ * remains with BladeX.
+ * <p>
+ * Using this software signifies agreement to this License, and the software
+ * must not be used for illegal purposes.
+ * <p>
+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
+ * not liable for any claims arising from secondary or illegal development.
+ * <p>
+ * Author: Chill Zhuang (bladejava@qq.com)
+ */
+package org.springblade.mdm.flow.excel;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 浠诲姟瀵煎叆excel
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class TaskAssignExcel implements Serializable {
+	@Serial
+	private static final long serialVersionUID = 1L;
+
+	@ExcelProperty("闆剁粍浠跺彿")
+	private String drawingNo;
+	@ExcelProperty("鍥惧彿鐗堟")
+	private String drawingNoEdition;
+	@ExcelProperty("宸ュ簭鍙�")
+	private String processNo;
+	@ExcelProperty("宸ュ簭鍚嶇О")
+	private String processName;
+
+
+	@ExcelProperty("宸ュ簭鐗堟")
+	private String processEdition;
+
+	@ExcelProperty("宸ヨ壓鐗堟")
+	private String craftEdition;
+
+	@ExcelProperty("鏈哄簥缂栧彿")
+	private String machineCode;
+
+	@ExcelProperty("涓存椂鏇存敼鍗�")
+	private String deviation;
+
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excel/TaskAssignImpResultExcel.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excel/TaskAssignImpResultExcel.java
new file mode 100644
index 0000000..077fd5f
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excel/TaskAssignImpResultExcel.java
@@ -0,0 +1,80 @@
+/**
+ * BladeX Commercial License Agreement
+ * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
+ * <p>
+ * Use of this software is governed by the Commercial License Agreement
+ * obtained after purchasing a license from BladeX.
+ * <p>
+ * 1. This software is for development use only under a valid license
+ * from BladeX.
+ * <p>
+ * 2. Redistribution of this software's source code to any third party
+ * without a commercial license is strictly prohibited.
+ * <p>
+ * 3. Licensees may copyright their own code but cannot use segments
+ * from this software for such purposes. Copyright of this software
+ * remains with BladeX.
+ * <p>
+ * Using this software signifies agreement to this License, and the software
+ * must not be used for illegal purposes.
+ * <p>
+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
+ * not liable for any claims arising from secondary or illegal development.
+ * <p>
+ * Author: Chill Zhuang (bladejava@qq.com)
+ */
+package org.springblade.mdm.flow.excel;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 浠诲姟瀵煎叆excel
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class TaskAssignImpResultExcel implements Serializable {
+	@Serial
+	private static final long serialVersionUID = 1L;
+
+	@ExcelProperty("闆剁粍浠跺彿")
+	private String drawingNo;
+	@ExcelProperty("鍥惧彿鐗堟")
+	private String drawingNoEdition;
+	@ExcelProperty("宸ュ簭鍙�")
+	private String processNo;
+	@ExcelProperty("宸ュ簭鍚嶇О")
+	private String processName;
+
+	@ExcelProperty("浜у搧鍨嬪彿")
+	@ExcelIgnore
+	private String productModel;
+
+	@ExcelProperty("宸ュ簭鐗堟")
+	private String processEdition;
+
+	@ExcelProperty("宸ヨ壓鐗堟")
+	private String craftEdition;
+
+	@ExcelProperty("鏈哄簥缂栧彿")
+	private String machineCode;
+
+	@ExcelProperty("璁惧鍨嬪彿")
+	@ExcelIgnore
+	private String machineMode;
+	@ExcelProperty("涓存椂鏇存敼鍗�")
+	private String deviation;
+
+	@ExcelProperty("閿欒淇℃伅")
+	private String errorMsg;
+
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/TaskImportService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/TaskImportService.java
new file mode 100644
index 0000000..a4243b3
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/TaskImportService.java
@@ -0,0 +1,191 @@
+package org.springblade.mdm.flow.service;
+
+import com.alibaba.excel.EasyExcel;
+import jodd.util.StringUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.oss.OssTemplate;
+import org.springblade.core.oss.model.BladeFile;
+import org.springblade.mdm.basesetting.machine.entity.Machine;
+import org.springblade.mdm.basesetting.machine.service.MachineService;
+import org.springblade.mdm.basesetting.producedivision.entity.QinzheFgb;
+import org.springblade.mdm.basesetting.producedivision.service.QinzheFgbService;
+import org.springblade.mdm.flow.entity.TaskDispatch;
+import org.springblade.mdm.flow.excel.TaskAssignExcel;
+import org.springblade.mdm.flow.excel.TaskAssignImpResultExcel;
+import org.springblade.mdm.flow.excution.StartDispatcher;
+import org.springblade.mdm.flow.vo.FlowStartResult;
+import org.springblade.mdm.flow.vo.TaskAssignVO;
+import org.springblade.mdm.program.service.NcNodeService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 鍥哄寲娴佺▼鏈嶅姟
+ */
+@Slf4j
+@Service
+public class TaskImportService {
+	@Autowired
+	private OssTemplate ossTemplate;
+	@Autowired
+	private QinzheFgbService qinzheFgbService;
+	@Autowired
+	private MachineService machineService;
+	@Autowired
+	private TaskDispatchService taskDispatchService;
+	@Autowired
+	private StartDispatcher dispatcher;
+	/**
+	 * 鍚姩鍥哄寲娴佺▼
+	 */
+
+	public BladeFile importTask(List<TaskAssignExcel> importTaskList,String oriFilename) throws IOException {
+		List<TaskAssignImpResultExcel> resultExcelList = new ArrayList<>();
+		for(TaskAssignExcel taskAssignExcel:importTaskList){
+			resultExcelList.add(importOne(taskAssignExcel));
+		}
+		Path resultPath = writeResultFile(resultExcelList);
+		BladeFile bfile;
+		try(InputStream ins = Files.newInputStream(resultPath);){
+			String baseName = FilenameUtils.getBaseName(oriFilename);
+			String ext = FilenameUtils.getExtension(oriFilename);
+			String filename = baseName+"-瀵煎叆缁撴灉" + (StringUtils.isNotBlank(ext)?"."+ext:"");
+			bfile = ossTemplate.putFile(filename,ins);
+		}
+
+		return bfile;
+	}
+
+	/**
+	 * 澶勭悊鍗曟潯鏁版嵁
+	 * @param excelInput excel鐨勪竴琛屾暟鎹�
+	 */
+	TaskAssignImpResultExcel importOne(TaskAssignExcel excelInput){
+
+		TaskAssignImpResultExcel impResult = checkData(excelInput);
+		if(StringUtils.isNotBlank(impResult.getErrorMsg())){
+			impResult.setErrorMsg(impResult.getErrorMsg());
+			return impResult;
+		}
+
+		TaskAssignVO startVO = new TaskAssignVO();
+		BeanUtils.copyProperties(impResult,startVO);
+		startVO.setTitle(NcNodeService.genProgramName(startVO.getDrawingNo(),startVO.getProcessNo(),startVO.getProcessEdition())+"-璁″垝浠诲姟");
+
+		try {
+			boolean isDuplicate = taskDispatchService.checkIsDuplicate(startVO);
+
+			TaskDispatch dispatch = taskDispatchService.saveTask(startVO,isDuplicate);
+			startVO.setCreateUser(dispatch.getCreateUser());
+			if(isDuplicate){
+				impResult.setErrorMsg("閲嶅娲惧伐");
+			}else {
+
+				try {
+					FlowStartResult result = dispatcher.start(startVO);
+					dispatch.setStatus(TaskDispatch.STATUS_STARTED);
+					dispatch.setProcessInstanceId(result.getProcessInstanceId());
+					dispatch.setProgramNo(result.getProgramNo());
+					taskDispatchService.updateById(dispatch);
+					impResult.setErrorMsg("瀵煎叆鎴愬姛");
+				} catch (Exception e) {
+					log.error("瀵煎叆浠诲姟start澶辫触,闆剁粍浠跺彿:{}", excelInput.getDrawingNo(), e);
+					dispatch.setStatus(TaskDispatch.STATUS_EXCEPTION);
+					dispatch.setErrMsg(e.getMessage());
+					taskDispatchService.updateById(dispatch);
+
+					impResult.setErrorMsg(e.getMessage());
+				}
+			}
+		}catch(Exception e){
+			log.error("瀵煎叆澶辫触,闆剁粍浠跺彿:{}",impResult.getDrawingNo(),e);
+			impResult.setErrorMsg(e.getMessage());
+		}
+
+		return impResult;
+	}
+
+	/**
+	 * 妫�鏌ユ暟鎹�
+	 * @param excelLine 涓�琛宔xcel鏁版嵁
+	 */
+	TaskAssignImpResultExcel checkData(TaskAssignExcel excelLine){
+		TaskAssignImpResultExcel resultExcel= new TaskAssignImpResultExcel();
+		BeanUtils.copyProperties(excelLine,resultExcel);
+		//涓虹┖鐨勬暟鎹鏌�
+		List<String> errors = new ArrayList<>();
+		if(StringUtil.isBlank(excelLine.getDrawingNo())){
+			errors.add("闆剁粍浠跺彿涓虹┖");
+		}
+		if(StringUtil.isBlank(excelLine.getProcessNo())){
+			errors.add("宸ュ簭鍙蜂负绌�");
+		}
+
+		if(StringUtil.isBlank(excelLine.getProcessEdition())){
+			errors.add("宸ュ簭鐗堟涓虹┖");
+		}
+		if(StringUtil.isBlank(excelLine.getProcessName())){
+			errors.add("宸ュ簭鍚嶇О涓虹┖");
+		}
+
+		if(StringUtil.isBlank(excelLine.getMachineCode())){
+			errors.add("鏈哄簥缂栧彿涓虹┖");
+		}
+
+		if(!errors.isEmpty()){
+			resultExcel.setErrorMsg(StringUtils.joinWith(",",errors));
+			return resultExcel;
+		}
+
+		try {
+			//ProduceDivision div = produceDivisionService.getByDrawingNoWithQinzhe(excelLine.getDrawingNo());
+			QinzheFgb fgb = qinzheFgbService.getByLjh(excelLine.getDrawingNo());
+			if(fgb == null){
+				errors.add("闆剁粍浠跺彿涓嶅瓨鍦�");
+			}else{
+				resultExcel.setProductModel(fgb.getCph());
+			}
+
+		}catch(ServiceException se){
+			errors.add(se.getMessage());
+		}
+		Machine machine = machineService.getByCode(excelLine.getMachineCode());
+		if(machine == null){
+			errors.add("鏈哄簥缂栧彿涓嶅瓨鍦�");
+		}else{
+			resultExcel.setMachineMode(machine.getName());
+		}
+		if(!errors.isEmpty()) {
+			resultExcel.setErrorMsg(StringUtils.joinWith(",", errors));
+		}
+		return resultExcel;
+	}
+
+	/**
+	 * 灏嗗鍏ョ粨鏋滃啓鍏ヤ复鏃舵枃浠�
+	 * @param importTaskList 瀵煎叆浠诲姟鍒楄〃
+	 * @return 鏂囦欢璺緞
+	 * @throws IOException 鍐欏叆鏂囦欢鍙兘鍊掓槸io寮傚父
+	 */
+	Path writeResultFile(List<TaskAssignImpResultExcel> importTaskList) throws IOException {
+		Path tempFilePath = Files.createTempFile("impresult",".xlsx");
+
+		String fileName = tempFilePath.toString();
+		EasyExcel.write(fileName, TaskAssignImpResultExcel.class).sheet("瀵煎叆缁撴灉").doWrite(importTaskList);
+
+		return tempFilePath;
+	}
+
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/task/controller/MachineBackTaskController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/task/controller/MachineBackTaskController.java
index a744d86..1091d70 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/task/controller/MachineBackTaskController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/task/controller/MachineBackTaskController.java
@@ -10,6 +10,7 @@
 import org.springblade.core.tenant.annotation.NonDS;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.DateUtil;
+import org.springblade.core.tool.utils.Func;
 import org.springblade.mdm.commons.service.OssFileCommonService;
 import org.springblade.mdm.gkw.task.service.MachineBackTaskService;
 import org.springblade.mdm.gkw.task.vo.MachineBackTaskQueryVO;
@@ -21,9 +22,7 @@
 import org.springblade.mdm.machinefile.vo.FileSendRecordVO;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -51,4 +50,16 @@
 		}
 		return R.data(machineBackTaskService.pageQuery(query));
 	}
+
+	@Operation(summary = "鍒犻櫎", description = "鍒犻櫎")
+	@PostMapping("/remove")
+	public R<Void> remove(@RequestParam String ids) {
+		try {
+			machineBackTaskService.removeBatchByIds(Func.toLongList(ids));
+		} catch (Exception e) {
+			log.error("鍒犻櫎寮傚父",e);
+			return R.fail(e.getMessage());
+		}
+		return R.success();
+	}
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/NcProgramExportInnerService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/NcProgramExportInnerService.java
index a23a423..6a824da 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/NcProgramExportInnerService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/NcProgramExportInnerService.java
@@ -116,6 +116,9 @@
 		}
 		for(Long backTaskId : backTaskIdList){
 			MachineBackTask backTask = machineBackTaskService.getById(backTaskId);
+			if(backTask == null){
+				break;
+			}
 			List<MachineAcceptedFile> acceptedFiles = machineAcceptedService.listByBackTaskId(backTaskId);
 
 			if(acceptedFiles.size() == backTask.getSegCount()) {
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/service/CuredProgramStatService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/service/CuredProgramStatService.java
index 4575fe5..330b16b 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/service/CuredProgramStatService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/service/CuredProgramStatService.java
@@ -94,7 +94,7 @@
 		query.orderByProcessInstanceEndTime().desc(); // 鎸夌粨鏉熸椂闂撮檷搴忔帓鍒�
 
 		IPage<CuredProgramVO> page = new Page<>();
-		long firstResult = (page.getCurrent()-1) * page.getSize();
+		long firstResult = (long) (queryVO.getCurrent() - 1) * queryVO.getSize();
 		List<HistoricProcessInstance> processes = query.listPage((int)firstResult,(int)queryVO.getSize());
 
 		page.setTotal(query.count());

--
Gitblit v1.9.3