From b0449f9ed437831018030d57b98a55e1dd43a6ef Mon Sep 17 00:00:00 2001
From: yangys <y_ys79@sina.com>
Date: 星期二, 17 六月 2025 15:39:47 +0800
Subject: [PATCH] 修改计划表表名

---
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java                      |   12 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/FlowVO.java                                          |  195 +++++++++++++++++++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramController.java                  |   38 ++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/OvertimeTaskExcelVO.java                             |   31 +++
 doc/sql/mdm/mdm.mysql.all.create.sql                                                                                   |    1 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/MyFlowController.java                        |   12 
 blade-service/blade-mdm/src/main/resources/processesbpmn/dispatch.bpmn20.xml                                           |   22 +-
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/producedivision/mapper/ProduceDivisionMapper.xml |    3 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramService.java                        |    5 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowMgrController.java                       |   41 +++-
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/task/dispatch/CureProgramCheckTask.java                 |    2 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowBusinessService.java                        |  178 +++++--------------
 12 files changed, 374 insertions(+), 166 deletions(-)

diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/producedivision/mapper/ProduceDivisionMapper.xml b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/producedivision/mapper/ProduceDivisionMapper.xml
index c3ef778..6bc337c 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/producedivision/mapper/ProduceDivisionMapper.xml
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/producedivision/mapper/ProduceDivisionMapper.xml
@@ -15,10 +15,11 @@
     </resultMap>-->
     <select id="pageQuery" resultType="org.springblade.mdm.basesetting.producedivision.vo.ProduceDivisionViewVO">
         select p.id,p.team_leader_id,p.programmer_id,p.checker_id,p.senior_id,l.name team_leader_name,pro.name  programmer_name,c.name checker_name,s.name seniorName
-        from mdm_produce_plan p join blade_user l on p.team_leader_id=l.id and l.is_deleted=0
+        from mdm_produce_division p join blade_user l on p.team_leader_id=l.id and l.is_deleted=0
                                 join blade_user pro on p.programmer_id=pro.id and pro.is_deleted=0
                                 join blade_user c on p.checker_id=c.id and c.is_deleted=0
                                 join blade_user s on p.senior_id=s.id and c.is_deleted=0
+                                                         where p.is_deleted=0
         <if test="name != null and name != ''">
             AND (l.account like concat('%',#{name,jdbcType=VARCHAR},'%') or l.name like
             concat('%',#{name,jdbcType=VARCHAR},'%')
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java
index a389a2b..bf87426 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java
@@ -51,8 +51,14 @@
 		if (Func.isEmpty(variables)) {
 			variables = Kv.create();
 		}
-		// 瀹屾垚浠诲姟
-		taskService.complete(taskId, variables);
-		return R.success("娴佺▼鎻愪氦鎴愬姛");
+		if(variables.containsKey("assignee")){
+			//鎸囧畾浜嗕笅涓�姝ユ墽琛屼汉
+			taskService.complete(taskId, variables);
+			return R.success("娴佺▼鎻愪氦鎴愬姛");
+		}else {
+			// 瀹屾垚浠诲姟,缁欓粯璁ょ敤鎴�
+			return R.fail("璇锋寚瀹氭祦绋嬩笅涓�姝ュ鐞嗕汉");
+		}
+
 	}
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowMgrController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowMgrController.java
index 1375348..f742e48 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowMgrController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowMgrController.java
@@ -5,24 +5,27 @@
 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.TaskService;
+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.tool.api.R;
-import org.springblade.core.tool.support.Kv;
-import org.springblade.core.tool.utils.Func;
-import org.springblade.core.tool.utils.StringUtil;
-import org.springblade.flow.core.pojo.entity.BladeFlow;
+import org.springblade.core.tool.utils.DateUtil;
+import org.springblade.mdm.basesetting.machine.vo.MachineExcelVO;
 import org.springblade.mdm.flow.service.FlowBusinessService;
+import org.springblade.mdm.flow.vo.FlowVO;
+import org.springblade.mdm.flow.vo.OvertimeTaskExcelVO;
 import org.springblade.mdm.flow.vo.TaskTraceVO;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.time.LocalDate;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import java.util.Map;
 
 @Slf4j
 @RestController
@@ -34,16 +37,34 @@
 	@Autowired
 	private FlowBusinessService businessService;
 
-	/**
-	 * 寰呭姙浠诲姟鍒楄〃椤�
-	 */
 	@GetMapping("overtime-list")
 	@ApiOperationSupport(order = 3)
 	@Operation(summary = "瓒呮椂鏌ヨ", description = "鏌ヨ鎵�鏈夎秴鏃朵换鍔�")
-	public R<IPage<BladeFlow>> overtimeList(@Parameter(description = "浠诲姟鍒拌揪鏃堕棿寮�濮�") LocalDate createTimeBegin, @Parameter(description = "浠诲姟鍒拌揪鏃堕棿鎴")LocalDate createTimeEnd, @Parameter(description = "鎵ц浜哄憳") String assigneeName, @Parameter(description = "鍏抽敭瀛�") String keyword, Query query) {
-		IPage<BladeFlow> pages = businessService.selectOvertimePage(Condition.getPage(query), createTimeBegin,createTimeEnd,assigneeName,keyword);
+	public R<IPage<FlowVO>> overtimeList(@Parameter(description = "浠诲姟鍒拌揪鏃堕棿寮�濮�") LocalDate createTimeBegin, @Parameter(description = "浠诲姟鍒拌揪鏃堕棿鎴")LocalDate createTimeEnd, @Parameter(description = "鎵ц浜哄憳") String assigneeName, @Parameter(description = "鍏抽敭瀛�") String keyword, Query query) {
+		IPage<FlowVO> pages = businessService.selectOvertimePage(Condition.getPage(query), createTimeBegin,createTimeEnd,assigneeName,keyword);
 		return R.data(pages);
 	}
+	@GetMapping("overtime-export")
+	@ApiOperationSupport(order = 3)
+	@Operation(summary = "瓒呮椂瀵煎嚭", description = "瓒呮椂浠诲姟瀵煎嚭")
+	public void overtimeExport(@Parameter(description = "浠诲姟鍒拌揪鏃堕棿寮�濮�") LocalDate createTimeBegin, @Parameter(description = "浠诲姟鍒拌揪鏃堕棿鎴")LocalDate createTimeEnd, @Parameter(description = "鎵ц浜哄憳") String assigneeName, @Parameter(description = "鍏抽敭瀛�") String keyword, Query query, HttpServletResponse response) {
+		query.setCurrent(1);
+		query.setSize(Integer.MAX_VALUE);
+		IPage<FlowVO> pages = businessService.selectOvertimePage(Condition.getPage(query), createTimeBegin,createTimeEnd,assigneeName,keyword);
+
+		List<OvertimeTaskExcelVO> list = new ArrayList<>();
+		pages.getRecords().forEach(data ->{
+			//data.get
+			OvertimeTaskExcelVO excelVO = new OvertimeTaskExcelVO();
+			BeanUtils.copyProperties(data, excelVO);
+
+			list.add(excelVO);
+		});
+
+		ExcelUtil.export(response, "瓒呮椂浠诲姟" + DateUtil.time(), "瓒呮椂浠诲姟琛�", list, OvertimeTaskExcelVO.class);
+	}
+
+
 
 	@GetMapping("process-trace")
 	public R<List<TaskTraceVO>> processTrace(long processInstanceId){
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/MyFlowController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/MyFlowController.java
index 38da7f5..e57a190 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/MyFlowController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/MyFlowController.java
@@ -13,10 +13,8 @@
 import org.springblade.core.tool.support.Kv;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringUtil;
-import org.springblade.flow.core.pojo.entity.BladeFlow;
-import org.springblade.mdm.flow.excution.StartDispatcher;
 import org.springblade.mdm.flow.service.FlowBusinessService;
-import org.springblade.mdm.flow.vo.TaskAssignVO;
+import org.springblade.mdm.flow.vo.FlowVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -39,8 +37,8 @@
 	@GetMapping("todo-list")
 	@ApiOperationSupport(order = 3)
 	@Operation(summary = "寰呭姙浠诲姟", description = "浼犲叆娴佺▼淇℃伅")
-	public R<IPage<BladeFlow>> todoList(@Parameter(description = "鍏抽敭瀛�") String keyword, @Parameter(description = "鍒涘缓鏃堕棿寮�濮�") LocalDate createTimeBegin, @Parameter(description = "鍒涘缓鏃堕棿鎴") LocalDate createTimeEnd, Query query) {
-		IPage<BladeFlow> pages = businessService.selectTodoPage(Condition.getPage(query), createTimeBegin,createTimeEnd,keyword);
+	public R<IPage<FlowVO>> todoList(@Parameter(description = "鍏抽敭瀛�") String keyword, @Parameter(description = "鍒涘缓鏃堕棿寮�濮�") LocalDate createTimeBegin, @Parameter(description = "鍒涘缓鏃堕棿鎴") LocalDate createTimeEnd, Query query) {
+		IPage<FlowVO> pages = businessService.selectTodoPage(Condition.getPage(query), createTimeBegin,createTimeEnd,keyword);
 		return R.data(pages);
 	}
 
@@ -50,8 +48,8 @@
 	@GetMapping("alltask-list")
 	@ApiOperationSupport(order = 3)
 	@Operation(summary = "鎵�鏈変换鍔★紙fortest锛�", description = "浼犲叆娴佺▼淇℃伅")
-	public R<IPage<BladeFlow>> alltaskList(@Parameter(description = "鍏抽敭瀛�") String keyword,LocalDate createTimeBegin,LocalDate createTimeEnd, Query query) {
-		IPage<BladeFlow> pages = businessService.selectAllTaskPage(Condition.getPage(query), keyword);
+	public R<IPage<FlowVO>> alltaskList(@Parameter(description = "鍏抽敭瀛�") String keyword, LocalDate createTimeBegin, LocalDate createTimeEnd, Query query) {
+		IPage<FlowVO> pages = businessService.selectAllTaskPage(Condition.getPage(query), keyword);
 		return R.data(pages);
 	}
 
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowBusinessService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowBusinessService.java
index b629ef5..a6189cb 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowBusinessService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowBusinessService.java
@@ -1,28 +1,4 @@
-/**
- * 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.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -30,27 +6,20 @@
 import org.flowable.engine.HistoryService;
 import org.flowable.engine.TaskService;
 import org.flowable.engine.history.HistoricProcessInstance;
-import org.flowable.engine.history.HistoricProcessInstanceQuery;
 import org.flowable.task.api.Task;
 import org.flowable.task.api.TaskQuery;
-import org.flowable.task.api.history.HistoricTaskInstance;
-import org.flowable.task.api.history.HistoricTaskInstanceQuery;
 import org.springblade.core.secure.utils.AuthUtil;
-import org.springblade.core.tool.support.Kv;
 import org.springblade.core.tool.utils.*;
-import org.springblade.flow.core.constant.ProcessConstant;
-import org.springblade.flow.core.pojo.entity.BladeFlow;
-import org.springblade.flow.core.utils.TaskUtil;
 
 import org.springblade.mdm.flow.entity.MdmFlowProcess;
 import org.springblade.mdm.flow.util.MdmFlowCache;
+import org.springblade.mdm.flow.vo.FlowVO;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDate;
 import java.util.Date;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Map;
 
 /**
  * 娴佺▼涓氬姟瀹炵幇绫�
@@ -65,49 +34,29 @@
 	private final HistoryService historyService;
 
 
-	public IPage<BladeFlow> selectTodoPage(IPage<BladeFlow> page, LocalDate createTimeBegin,LocalDate createTimeEnd, String keyword) {
+	public IPage<FlowVO> selectTodoPage(IPage<FlowVO> page, LocalDate createTimeBegin, LocalDate createTimeEnd, String keyword) {
 		//String taskUser = TaskUtil.getTaskUser();
-		String userId = ""+AuthUtil.getUserId();
-		List<BladeFlow> flowList = new LinkedList<>();
+		String userId = "" + AuthUtil.getUserId();
+		List<FlowVO> flowList = new LinkedList<>();
 
 		TaskQuery todoQuery = taskService.createTaskQuery().taskAssignee(userId).active().includeProcessVariables();
-		if(Func.isNotEmpty(createTimeBegin)){
+		if (Func.isNotEmpty(createTimeBegin)) {
 			todoQuery.taskCreatedAfter(DateUtil.toDate(createTimeBegin));
 			//濡傛灉鏌ヨ瀹炰緥鐨勫紑濮嬫椂闂达細todoQuery.taskInProgressStartDueAfter()
 		}
-		if(Func.isNotEmpty(createTimeEnd)){
+		if (Func.isNotEmpty(createTimeEnd)) {
 			todoQuery.taskCreatedBefore(DateUtil.toDate(createTimeEnd));
 
 		}
-		if(Func.isNotEmpty(keyword)){
-			todoQuery.or();
-
-			todoQuery.processVariableValueLike("processNo",keyword);
-			todoQuery.processVariableValueLike("machineCode",keyword);
-			todoQuery.processVariableValueLike("machineMode",keyword);
-
-			todoQuery.processVariableValueLike("processName",keyword);
-			todoQuery.processVariableValueLike("processEdition",keyword);
-
-			todoQuery.processVariableValueLike("craftEdition",keyword);
-			//TODO 澶氫釜瀛楁閮借鍖归厤
-
-			todoQuery.endOr();
+		if (Func.isNotEmpty(keyword)) {
+			addKeywordCondition(todoQuery, keyword);
 		}
 
 		todoQuery.orderByTaskCreateTime().desc();
-		//List<Task> listt = todoQuery.list();
-
-		// 宸茬鏀剁殑浠诲姟.caseVariableValueLike("processNo",keyword)
-		/*
-		TaskQuery todoQuery = taskService.createTaskQuery().taskAssignee(userId).active()
-			.includeProcessVariables().orderByTaskCreateTime().desc();
-
-		 */
 
 		// 鏋勫缓鍒楄〃鏁版嵁
-		BladeFlow bladeFlow = new BladeFlow();
-		buildFlowTaskList(bladeFlow, flowList, todoQuery, "todo");//FlowEngineConstant.STATUS_TODO
+		FlowVO bladeFlow = new FlowVO();
+		buildFlowTaskList(bladeFlow, flowList, todoQuery);//FlowEngineConstant.STATUS_TODO , "todo"
 
 		// 璁$畻鎬绘暟
 		long count = todoQuery.count();
@@ -118,6 +67,21 @@
 		// 璁剧疆鏁版嵁
 		page.setRecords(flowList);
 		return page;
+	}
+
+	void addKeywordCondition(TaskQuery todoQuery,String keyword) {
+		if(Func.isNotEmpty(keyword)) {
+			todoQuery.or();
+
+			todoQuery.processVariableValueLike("processNo", "%" + keyword + "%");
+			todoQuery.processVariableValueLike("machineCode", "%" + keyword + "%");
+			todoQuery.processVariableValueLike("machineMode", "%" + keyword + "%");
+			todoQuery.processVariableValueLike("processName", "%" + keyword + "%");
+			todoQuery.processVariableValueLike("processEdition", "%" + keyword + "%");
+			todoQuery.processVariableValueLike("craftEdition", "%" + keyword + "%");
+
+			todoQuery.endOr();
+		}
 	}
 	/*
 	@Override
@@ -258,25 +222,6 @@
 		return page;
 	}
 
-	@Override
-	public boolean completeTask(BladeFlow flow) {
-		String taskId = flow.getTaskId();
-		String processInstanceId = flow.getProcessInstanceId();
-		String comment = Func.toStr(flow.getComment(), ProcessConstant.PASS_COMMENT);
-		// 澧炲姞璇勮
-		if (StringUtil.isNoneBlank(processInstanceId, comment)) {
-			taskService.addComment(taskId, processInstanceId, comment);
-		}
-		// 鍒涘缓鍙橀噺
-		Map<String, Object> variables = flow.getVariables();
-		if (variables == null) {
-			variables = Kv.create();
-		}
-		variables.put(ProcessConstant.PASS_KEY, flow.isPass());
-		// 瀹屾垚浠诲姟
-		taskService.complete(taskId, variables);
-		return true;
-	}
 	*/
 	/**
 	 * 鏋勫缓娴佺▼
@@ -284,9 +229,8 @@
 	 * @param bladeFlow 娴佺▼閫氱敤绫�
 	 * @param flowList  娴佺▼鍒楄〃
 	 * @param taskQuery 浠诲姟鏌ヨ绫�
-	 * @param status    鐘舵��
 	 */
-	private void buildFlowTaskList(BladeFlow bladeFlow, List<BladeFlow> flowList, TaskQuery taskQuery, String status) {
+	private void buildFlowTaskList(FlowVO bladeFlow, List<FlowVO> flowList, TaskQuery taskQuery) {
 		if (bladeFlow.getCategory() != null) {
 			taskQuery.processCategoryIn(Func.toStrList(bladeFlow.getCategory()));
 		}
@@ -301,7 +245,7 @@
 		}
 		List<Task> tasks = taskQuery.list();
 		tasks.forEach(task -> {
-			BladeFlow flow = new BladeFlow();
+			FlowVO flow = new FlowVO();
 			flow.setTaskId(task.getId());
 			flow.setTaskDefinitionKey(task.getTaskDefinitionKey());
 			flow.setTaskName(task.getName());
@@ -310,20 +254,15 @@
 			flow.setClaimTime(task.getClaimTime());
 			flow.setExecutionId(task.getExecutionId());
 			flow.setVariables(task.getProcessVariables());
+			flow.setDueDate(task.getDueDate());
 
 			flow.setProcessDefinitionId(task.getProcessDefinitionId());
-			//flow.setProcessDefinitionName(task.getprocessd);
+
 
 			//flow.setProcessDefinitionKey(processDefinition.getKey());
 			//flow.setProcessDefinitionVersion(processDefinition.getVersion());
 			flow.setProcessInstanceId(task.getProcessInstanceId());
-			/*
-			HistoricProcessInstance historicProcessInstance = getHistoricProcessInstance(task.getProcessInstanceId());
-			if (Func.isNotEmpty(historicProcessInstance)) {
-				String[] businessKey = Func.toStrArray(StringPool.COLON, historicProcessInstance.getBusinessKey());
-				flow.setBusinessTable(businessKey[0]);
-				flow.setBusinessId(businessKey[1]);
-			}*/
+
 
 			MdmFlowProcess processDefinition = MdmFlowCache.getProcessDefinition(task.getProcessDefinitionId());
 
@@ -335,8 +274,7 @@
 			flow.setProcessDefinitionVersion(processDefinition.getVersion());
 			flow.setProcessInstanceId(task.getProcessInstanceId());
 			//flow.setStatus(status);
-			/*
-			 */
+
 			flowList.add(flow);
 		});
 	}
@@ -351,33 +289,20 @@
 		return historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
 	}
 
-	public IPage<BladeFlow> selectAllTaskPage(IPage<BladeFlow> page, String keyword) {
+	public IPage<FlowVO> selectAllTaskPage(IPage<FlowVO> page, String keyword) {
 
-		List<BladeFlow> flowList = new LinkedList<>();
+		List<FlowVO> flowList = new LinkedList<>();
 
 		TaskQuery todoQuery = taskService.createTaskQuery().active().includeProcessVariables();
 
-		if(Func.isNotEmpty(keyword)){
-			todoQuery.or();
 
-			todoQuery.processVariableValueLike("processNo",keyword);
-			todoQuery.processVariableValueLike("machineCode",keyword);
-			todoQuery.processVariableValueLike("machineMode",keyword);
-
-			todoQuery.processVariableValueLike("processName",keyword);
-			todoQuery.processVariableValueLike("processEdition",keyword);
-
-			todoQuery.processVariableValueLike("craftEdition",keyword);
-			//TODO 澶氫釜瀛楁閮借鍖归厤
-
-			todoQuery.endOr();
-		}
+		addKeywordCondition(todoQuery, keyword);
 
 		todoQuery.orderByTaskCreateTime().desc();
 
 		// 鏋勫缓鍒楄〃鏁版嵁
-		BladeFlow bladeFlow = new BladeFlow();
-		buildFlowTaskList(bladeFlow, flowList, todoQuery, "todo");//FlowEngineConstant.STATUS_TODO
+		FlowVO bladeFlow = new FlowVO();
+		buildFlowTaskList(bladeFlow, flowList, todoQuery);//FlowEngineConstant.STATUS_TODO
 
 		// 璁$畻鎬绘暟
 		long count = todoQuery.count();
@@ -392,13 +317,13 @@
 
 	/**
 	 * 瓒呮椂浠诲姟鏌ヨ
-	 * @param page
-	 * @param keyword
-	 * @return
+	 * @param page 鍒嗛〉淇℃伅
+	 * @param keyword 鍏抽敭瀛�
+	 * @return 鍒嗛〉鏁版嵁
 	 */
-	public IPage<BladeFlow> selectOvertimePage(IPage<BladeFlow> page,LocalDate createTimeBegin,LocalDate createTimeEnd, String assigneeName,String keyword) {
+	public IPage<FlowVO> selectOvertimePage(IPage<FlowVO> page, LocalDate createTimeBegin, LocalDate createTimeEnd, String assigneeName, String keyword) {
 
-		List<BladeFlow> flowList = new LinkedList<>();
+		List<FlowVO> flowList = new LinkedList<>();
 		Date now = new Date();
 		TaskQuery todoQuery = taskService.createTaskQuery().taskDueBefore(now).active().includeProcessVariables();
 		if(Func.isNotEmpty(createTimeBegin)) {
@@ -411,27 +336,14 @@
 		if(Func.isNotEmpty(keyword)) {
 			todoQuery.taskVariableValueLike("assigneeName", "%"+assigneeName+"%");
 		}
-		if(Func.isNotEmpty(keyword)){
-			todoQuery.or();
-			keyword = "%"+keyword+"%";
-			todoQuery.processVariableValueLike("processNo",keyword);
-			todoQuery.processVariableValueLike("machineCode",keyword);
-			todoQuery.processVariableValueLike("machineMode",keyword);
 
-			todoQuery.processVariableValueLike("processName",keyword);
-			todoQuery.processVariableValueLike("processEdition",keyword);
-
-			todoQuery.processVariableValueLike("craftEdition",keyword);
-			//TODO 澶氫釜瀛楁閮借鍖归厤
-
-			todoQuery.endOr();
-		}
+		addKeywordCondition(todoQuery, keyword);
 
 		todoQuery.orderByTaskCreateTime().desc();
 
 		// 鏋勫缓鍒楄〃鏁版嵁
-		BladeFlow bladeFlow = new BladeFlow();
-		buildFlowTaskList(bladeFlow, flowList, todoQuery, "todo");//FlowEngineConstant.STATUS_TODO
+		FlowVO bladeFlow = new FlowVO();
+		buildFlowTaskList(bladeFlow, flowList, todoQuery);//FlowEngineConstant.STATUS_TODO
 
 		// 璁$畻鎬绘暟
 		long count = todoQuery.count();
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/task/dispatch/CureProgramCheckTask.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/task/dispatch/CureProgramCheckTask.java
index 0e1b8a6..8b013e1 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/task/dispatch/CureProgramCheckTask.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/task/dispatch/CureProgramCheckTask.java
@@ -14,6 +14,6 @@
 		String hasCuredProgram =  (String)execution.getVariable("hasCuredProgram");
 		NcProgram ncProgram =  (NcProgram)execution.getVariable("curedNcProgram");
 
-		System.out.println("鎵ц鏈嶅姟浠诲姟");
+		System.out.println("鎵ц鍥哄寲绋嬪簭浠诲姟鏈嶅姟");
 	}
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/FlowVO.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/FlowVO.java
new file mode 100644
index 0000000..96e2887
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/FlowVO.java
@@ -0,0 +1,195 @@
+/**
+ * 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.vo;
+
+import lombok.Data;
+import org.springblade.flow.core.constant.ProcessConstant;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * mdm宸ヤ綔娴侀�氱敤瀹炰綋绫�
+ *
+ * @author yangys
+ */
+@Data
+public class FlowVO implements Serializable {
+	@Serial
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 浠诲姟缂栧彿
+	 */
+	private String taskId;
+	/**
+	 * 浠诲姟鍚嶇О
+	 */
+	private String taskName;
+	/**
+	 * 浠诲姟瀹氫箟Key
+	 */
+	private String taskDefinitionKey;
+	/**
+	 * 浠诲姟鎵ц浜虹紪鍙�
+	 */
+	private String assignee;
+	/**
+	 * 浠诲姟鎵ц浜哄悕绉�
+	 */
+	private String assigneeName;
+	/**
+	 * 娴佺▼鍒嗙被
+	 */
+	private String category;
+	/**
+	 * 娴佺▼鍒嗙被鍚�
+	 */
+	private String categoryName;
+	/**
+	 * 鍒涘缓鏃堕棿
+	 */
+	private Date createTime;
+	/**
+	 * 缁撴潫鏃堕棿
+	 */
+	private Date endTime;
+	/**
+	 * 绛炬敹鏃堕棿
+	 */
+	private Date claimTime;
+	/**
+	 * 鍘嗗彶浠诲姟缁撴潫鏃堕棿
+	 */
+	private Date historyTaskEndTime;
+	/**
+	 * 鎵цID
+	 */
+	private String executionId;
+	/**
+	 * 娴佺▼瀹炰緥ID
+	 */
+	private String processInstanceId;
+	/**
+	 * 娴佺▼ID
+	 */
+	private String processDefinitionId;
+	/**
+	 * 娴佺▼鏍囪瘑
+	 */
+	private String processDefinitionKey;
+	/**
+	 * 娴佺▼鍚�
+	 */
+	private String processDefinitionName;
+	/**
+	 * 娴佺▼鐗堟湰
+	 */
+	private int processDefinitionVersion;
+	/**
+	 * 娴佺▼璇存槑
+	 */
+	private String processDefinitionDesc;
+	/**
+	 * 娴佺▼绠�鍥惧悕
+	 */
+	private String processDefinitionDiagramResName;
+	/**
+	 * 娴佺▼閲嶅懡鍚�
+	 */
+	private String processDefinitionResName;
+	/**
+	 * 鍘嗗彶浠诲姟娴佺▼瀹炰緥ID 鏌ョ湅娴佺▼鍥句細鐢ㄥ埌
+	 */
+	private String historyProcessInstanceId;
+	/**
+	 * 娴佺▼瀹炰緥鏄惁缁撴潫
+	 */
+	private String processIsFinished;
+	/**
+	 * 鍘嗗彶娲诲姩ID
+	 */
+	private String historyActivityId;
+	/**
+	 * 鍘嗗彶娲诲姩娴佺▼
+	 */
+	private String historyActivityName;
+	/**
+	 * 鍘嗗彶娲诲姩鑰楁椂
+	 */
+	private String historyActivityDurationTime;
+	/**
+	 * 涓氬姟缁戝畾Table
+	 */
+	private String businessTable;
+	/**
+	 * 涓氬姟缁戝畾ID
+	 */
+	private String businessId;
+	/**
+	 * 浠诲姟鐘舵��
+	 */
+	private String status;
+	/**
+	 * 浠诲姟鎰忚
+	 */
+	private String comment;
+	/**
+	 * 鏄惁閫氳繃
+	 */
+	private boolean isPass;
+	/**
+	 * 鏄惁閫氳繃浠e彿
+	 */
+	private String flag;
+	/**
+	 * 寮�濮嬫煡璇㈡棩鏈�
+	 */
+	private Date beginDate;
+	/**
+	 * 缁撴潫鏌ヨ鏃ユ湡
+	 */
+	private Date endDate;
+	/**
+	 * 娴佺▼鍙傛暟
+	 */
+	private Map<String, Object> variables;
+
+	/**
+	 * 瑕佹眰瀹屾垚鐨勬椂闂达紙瓒呮椂鏃堕棿锛�
+	 */
+	private Date dueDate;
+
+	/**
+	 * 鑾峰彇鏄惁閫氳繃
+	 */
+	public boolean isPass() {
+		return ProcessConstant.PASS_ALIAS.equals(flag) || ProcessConstant.PASS_COMMENT.equals(comment);
+	}
+
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/OvertimeTaskExcelVO.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/OvertimeTaskExcelVO.java
new file mode 100644
index 0000000..1815614
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/OvertimeTaskExcelVO.java
@@ -0,0 +1,31 @@
+package org.springblade.mdm.flow.vo;
+
+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.time.LocalDateTime;
+import java.util.Date;
+
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class OvertimeTaskExcelVO {
+
+	@ExcelProperty("鎵ц浜哄憳")
+	private String assigneeName;
+
+	@ExcelProperty("浠诲姟鍚嶇О")
+	private String processDefinitionName;
+	@ExcelProperty("浠诲姟鑺傜偣")
+	private String taskName;
+
+	@ExcelProperty("浠诲姟鍒拌揪鏃堕棿")
+	private LocalDateTime time;
+
+	@ExcelProperty("瑕佹眰瀹屾垚鏃堕棿")
+	private Date dueDate;
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramController.java
new file mode 100644
index 0000000..a155b7e
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramController.java
@@ -0,0 +1,38 @@
+
+package org.springblade.mdm.program.controller;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springblade.core.tenant.annotation.NonDS;
+import org.springblade.core.tool.api.R;
+import org.springblade.mdm.program.service.NcProgramService;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * 绋嬪簭鑺傜偣
+ *
+ * @author yangys
+ */
+@NonDS
+@RestController
+@RequestMapping("/program/ncfile")
+@AllArgsConstructor
+@Tag(name = "鏁版帶绋嬪簭", description = "鏁版帶绋嬪簭")
+@Slf4j
+public class NcProgramController {
+
+	private final NcProgramService ncProgramService;
+
+	@PostMapping("/upload")
+	@Operation(summary = "涓婁紶", description = "涓婁紶绋嬪簭/闄勪欢鏂囦欢")
+	public R<Boolean> upload(@RequestParam MultipartFile file,Long nodeId,
+							 @RequestParam String category) {
+		ncProgramService.uploadNcFile(file,nodeId,category);
+		return R.<Boolean>status(true);
+	}
+
+
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramService.java
index b0bffe1..4486e71 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramService.java
@@ -36,6 +36,8 @@
 import org.springblade.mdm.program.entity.NcProgram;
 import org.springblade.mdm.program.vo.DncSendBackData;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
@@ -69,4 +71,7 @@
 		return this.getBaseMapper().getCuredNcProgram(partNo,machine.getMachineGroupCode());
 	}
 
+	public void uploadNcFile(MultipartFile file,Long nodeId, String category) {
+
+	}
 }
diff --git a/blade-service/blade-mdm/src/main/resources/processesbpmn/dispatch.bpmn20.xml b/blade-service/blade-mdm/src/main/resources/processesbpmn/dispatch.bpmn20.xml
index 69752fa..ac40b66 100644
--- a/blade-service/blade-mdm/src/main/resources/processesbpmn/dispatch.bpmn20.xml
+++ b/blade-service/blade-mdm/src/main/resources/processesbpmn/dispatch.bpmn20.xml
@@ -4,9 +4,9 @@
     <startEvent id="start" name="寮�濮�"/>
     <sequenceFlow id="sid-c1619263-d1ff-4106-9315-f9ab9a3bee71" sourceRef="start" targetRef="teamLeaderTask"/>
     <userTask id="teamLeaderTask" name="涓撲笟缁勯暱" flowable:assignee="${teamLeader}"/>
-    <userTask id="programmingTask" name="缂栧埗" flowable:assignee="${programmer}"/>
-    <userTask id="check" name="鏍″" flowable:assignee="${checker}"/>
-    <userTask id="approveTask" name="楂樺笀瀹℃壒" flowable:assignee="${senior}"/>
+    <userTask id="programmingTask" name="缂栧埗" flowable:assignee="${assignee}"/>
+    <userTask id="check" name="鏍″" flowable:assignee="${assignee}"/>
+    <userTask id="approveTask" name="楂樺笀瀹℃壒" flowable:assignee="${assignee}"/>
     <endEvent id="approveEnd" name="瀹℃壒瀹屾垚"/>
     <sequenceFlow id="programingToCheck" sourceRef="programmingTask" targetRef="check" name="缂栧埗瀹屾垚缁欐牎瀵�">
       <conditionExpression xsi:type="tFormalExpression">${approve=='Y'}</conditionExpression>
@@ -24,30 +24,30 @@
       <conditionExpression xsi:type="tFormalExpression">${approve=='Y'}</conditionExpression>
     </sequenceFlow>
     <serviceTask id="cureCheckServiceTask" flowable:exclusive="true" name="鍥哄寲绋嬪簭妫�鏌ユ湇鍔′换鍔�" flowable:expression="cureProgramCheckTask.execute(execution)"/>
-    <userTask id="sid-015ac835-1083-489a-9496-97dbb9432d09" name="妫�鏌ョ▼搴忔槸鍚﹀彲鐢�"/>
+    <userTask id="sid-015ac835-1083-489a-9496-97dbb9432d09" name="妫�鏌ョ▼搴忔槸鍚﹀彲鐢�" flowable:assignee="${assignee}"/>
     <sequenceFlow id="sid-46ccac64-2d48-4933-88a6-f2941ae131dd" sourceRef="teamLeaderTask" targetRef="programmingTask">
-      <conditionExpression xsi:type="tFormalExpression">hasCuredProgram==鈥楴'</conditionExpression>
+      <conditionExpression xsi:type="tFormalExpression">${approve=='Y' &amp;&amp; hasCuredProgram=='N'}</conditionExpression>
     </sequenceFlow>
     <sequenceFlow id="sid-af92e6ab-bc80-43ed-8b09-1d3ec54cc9e7" sourceRef="teamLeaderTask" targetRef="cureCheckServiceTask">
-      <conditionExpression xsi:type="tFormalExpression">hasCuredProgram==鈥榊'</conditionExpression>
+      <conditionExpression xsi:type="tFormalExpression">${approve=='Y' &amp;&amp; hasCuredProgram=='Y'}</conditionExpression>
     </sequenceFlow>
     <sequenceFlow id="sid-353381d5-35c7-47b0-bf5b-2bafe865ab5e" sourceRef="cureCheckServiceTask" targetRef="sid-015ac835-1083-489a-9496-97dbb9432d09"/>
     <sequenceFlow id="sid-d144dad0-dc94-4a2b-96d6-9d8451b05ec1" sourceRef="sid-015ac835-1083-489a-9496-97dbb9432d09" targetRef="sid-82237034-5cb2-45c7-9a74-e2d5abb3b398" name="鍥哄寲绋嬪簭鍙敤">
-      <conditionExpression>approve=='Y'</conditionExpression>
+      <conditionExpression>${approve=='Y'}</conditionExpression>
     </sequenceFlow>
     <sequenceFlow id="sid-d4133565-1a45-4bb6-b603-9b9e4db1cdbb" sourceRef="approveTask" targetRef="check">
-      <conditionExpression>{approve=='N'}</conditionExpression>
+      <conditionExpression>${approve=='N'}</conditionExpression>
     </sequenceFlow>
     <exclusiveGateway id="sid-82237034-5cb2-45c7-9a74-e2d5abb3b398" name="鍙敤绋嬪簭娴佽浆缃戝叧"/>
     <sequenceFlow id="sid-b15dcf6a-a48c-4e01-b6bc-5c2a74ca817e" sourceRef="sid-82237034-5cb2-45c7-9a74-e2d5abb3b398" targetRef="check" name="宸ュ簭鐗堟涓�鑷村苟涓斿彲鐢�">
-      <conditionExpression xsi:type="tFormalExpression">processEditionEqual=='Y'</conditionExpression>
+      <conditionExpression xsi:type="tFormalExpression">${processEditionEqual=='Y'}</conditionExpression>
     </sequenceFlow>
     <sequenceFlow id="sid-6249886b-7c4a-4904-9b0b-cf743932be9f" sourceRef="sid-82237034-5cb2-45c7-9a74-e2d5abb3b398" targetRef="emptyUpgradeProcessEdtionServiceTask">
-      <conditionExpression xsi:type="tFormalExpression">processEditionEqual=='N'</conditionExpression>
+      <conditionExpression xsi:type="tFormalExpression">${processEditionEqual=='N'}</conditionExpression>
     </sequenceFlow>
     <sequenceFlow id="sid-598e1dbe-85b3-40d0-89c8-bd2580ecbfc5" sourceRef="emptyUpgradeProcessEdtionServiceTask" targetRef="check"/>
     <sequenceFlow id="sid-80b50f96-7601-4ba2-8c32-968923170d25" sourceRef="sid-015ac835-1083-489a-9496-97dbb9432d09" targetRef="programmingTask">
-      <conditionExpression>approve=='N'</conditionExpression>
+      <conditionExpression>${approve=='N'}</conditionExpression>
     </sequenceFlow>
     <serviceTask id="emptyUpgradeProcessEdtionServiceTask" flowable:exclusive="true" name="绌哄崌鐗�" flowable:expression="programEmptyUpgradeProcessEdtionTask.execute(execution)"/>
   </process>
diff --git a/doc/sql/mdm/mdm.all.create.sql b/doc/sql/mdm/mdm.mysql.all.create.sql
similarity index 99%
rename from doc/sql/mdm/mdm.all.create.sql
rename to doc/sql/mdm/mdm.mysql.all.create.sql
index ecc0c28..41f0ffb 100644
--- a/doc/sql/mdm/mdm.all.create.sql
+++ b/doc/sql/mdm/mdm.mysql.all.create.sql
@@ -86,6 +86,7 @@
   `code` varchar(100) NOT NULL COMMENT '绋嬪簭缂栧彿',
   `name` varchar(100) NOT NULL COMMENT '绋嬪簭鍚嶇О',
   `package_name` varchar(100) NOT NULL COMMENT '绋嬪簭鍖呭悕',
+  `url` varchar(400) NOT NULL COMMENT '鏂囦欢鍦板潃',
   `machine_code` bigint DEFAULT NULL COMMENT '璁惧缂栧彿/鏈哄簥缂栧彿',
   `part_no` varchar(100) NOT NULL COMMENT '闆剁粍浠剁紪鍙�',
   `is_cured` int DEFAULT NULL COMMENT '鏄惁鍥哄寲,1鏄�;0鍚�',

--
Gitblit v1.9.3