From 80a641659a361c9f55c57936daca0a1790f777d5 Mon Sep 17 00:00:00 2001
From: yangys <y_ys79@sina.com>
Date: 星期四, 12 六月 2025 22:55:06 +0800
Subject: [PATCH] 机床组改为字典

---
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/vo/MachineQueryVO.java                      |    4 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java                         |    5 
 blade-service/blade-mdm/src/main/resources/processesbpmn/program-cure.bpmn20.xml                                          |   45 +++++++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machinegroup/controller/MachineGroupController.java |    2 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/entity/Machine.java                         |    4 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/vo/MachineSaveVO.java                       |    4 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/MyFlowController.java                           |   35 ++++++
 blade-service/blade-mdm/src/main/resources/processesbpmn/dispatch.bpmn20.xml                                              |   92 ++++++++++++++---
 doc/sql/mdm/mdm.all.create.sql                                                                                            |   50 ++++++++-
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowBusinessService.java                           |   40 +++++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/mapper/MachineMapper.xml                    |    4 
 11 files changed, 246 insertions(+), 39 deletions(-)

diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/entity/Machine.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/entity/Machine.java
index c768300..1a9f05f 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/entity/Machine.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/entity/Machine.java
@@ -13,9 +13,9 @@
 	private String name;
 	private String code;
 	/**
-	 * 鎵�灞炴満搴婄粍ID
+	 * 鎵�灞炴満搴婄粍code锛屽瓧鍏竚achine_group
  	 */
-	private Long machineGroupId;
+	private String machineGroupCode;
 	/**
 	 * 鏈哄櫒瑙勬牸:01杞﹀簥/02閾e簥,鍦ㄤ笟鍔″瓧鍏搁厤缃紙key=machine_spec锛�
 	 */
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/mapper/MachineMapper.xml b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/mapper/MachineMapper.xml
index c3836a5..5a5c097 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/mapper/MachineMapper.xml
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/mapper/MachineMapper.xml
@@ -14,8 +14,8 @@
         <result column="is_deleted" property="isDeleted"/>
     </resultMap>
     <select id="pageQuery" resultType="org.springblade.mdm.basesetting.machine.vo.MachineVO">
-        select m.id,m.name,m.code,g.name group_name,m.machine_spec,m.manufacturer,m.operator
-        from mdm_machine m join mdm_machine_group g on m.machine_group_id=g.id
+        select m.id,m.name,m.code,g.dict_value group_name,m.machine_spec,m.manufacturer,m.operator
+        from mdm_machine m join blade_dict_biz g on m.machine_group_code=g.dict_key and g.code='machine_group' and g.is_deleted=0
             ${ew.customSqlSegment}
     </select>
 
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/vo/MachineQueryVO.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/vo/MachineQueryVO.java
index 654c29f..08979db 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/vo/MachineQueryVO.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/vo/MachineQueryVO.java
@@ -15,7 +15,7 @@
 public class MachineQueryVO extends Query {
 	@Schema(description = "鍚嶇О鎴栫紪鐮�")
 	private String keyword;
-	@Schema(description = "鏈哄簥缁刬d")
-	private Long machineGroupId;
+	@Schema(description = "鏈哄簥缁刢ode")
+	private Long machineGroupCode;
 
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/vo/MachineSaveVO.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/vo/MachineSaveVO.java
index 647cf0d..0a776e0 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/vo/MachineSaveVO.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/vo/MachineSaveVO.java
@@ -12,9 +12,9 @@
 	private String code;
 	private String name;
 	/**
-	 * 鎵�灞炴満搴婄粍ID
+	 * 鎵�灞炴満搴婄粍code,瀛楀吀machine_group
 	 */
-	private Long machineGroupId;
+	private String machineGroupCode;
 	/**
 	 * 鏈哄櫒瑙勬牸:01杞﹀簥/02閾e簥,鍦ㄤ笟鍔″瓧鍏搁厤缃紙key=machine_spec锛�
 	 */
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machinegroup/controller/MachineGroupController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machinegroup/controller/MachineGroupController.java
index fb3b7ba..272cbbd 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machinegroup/controller/MachineGroupController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machinegroup/controller/MachineGroupController.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.v3.oas.annotations.Hidden;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
@@ -20,6 +21,7 @@
 @RestController
 @RequestMapping("/machinegroup")
 @Tag(name = "鏈哄簥缁�", description = "鏈哄簥缁�")
+@Hidden
 public class MachineGroupController {
 
 	@Autowired
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 80e0881..b141fa6 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
@@ -1,6 +1,7 @@
 package org.springblade.mdm.flow.controller;
 
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.flowable.engine.TaskService;
@@ -38,9 +39,9 @@
 		dispatcher.start(startVO);
 		return R.<Boolean>status(true);
 	}
-
+	@Operation(summary = "瀹屾垚浠诲姟", description = "娴佸悜涓嬩竴涓妭鐐�")
 	@PostMapping("completeTask")
-	public R<Void> completeTask(String taskId, String processInstanceId, String comment, @RequestBody Map<String, Object> variables) {
+	public R<Void> completeTask(String taskId, String processInstanceId, String comment,@Parameter(name="variables",description = "浠诲姟鍙橀噺")@RequestBody Map<String, Object> variables) {
 		// 澧炲姞璇勮
 		if (StringUtil.isNoneBlank(processInstanceId, comment)) {
 			taskService.addComment(taskId, processInstanceId, comment);
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 ea3ebd6..2166277 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
@@ -27,18 +27,47 @@
 @RequestMapping("/flow/")
 @Tag(name = "娲惧伐娴佺▼", description = "娲惧伐娴佺▼")
 public class MyFlowController {
-
+	@Autowired
+	private TaskService taskService;
 	@Autowired
 	private FlowBusinessService businessService;
 
 	/**
-	 * 寰呭姙浜嬪姟鍒楄〃椤�
+	 * 寰呭姙浠诲姟鍒楄〃椤�
 	 */
 	@GetMapping("todo-list")
 	@ApiOperationSupport(order = 3)
-	@Operation(summary = "鎴戠殑娴佺▼", description = "浼犲叆娴佺▼淇℃伅")
+	@Operation(summary = "寰呭姙浠诲姟", description = "浼犲叆娴佺▼淇℃伅")
 	public R<IPage<BladeFlow>> todoList(@Parameter(description = "鍏抽敭瀛�") String keyword, Query query) {
 		IPage<BladeFlow> pages = businessService.selectTodoPage(Condition.getPage(query), keyword);
 		return R.data(pages);
 	}
+
+	/**
+	 * 寰呭姙浠诲姟鍒楄〃椤�
+	 */
+	@GetMapping("alltask-list")
+	@ApiOperationSupport(order = 3)
+	@Operation(summary = "鎵�鏈変换鍔★紙fortest锛�", description = "浼犲叆娴佺▼淇℃伅")
+	public R<IPage<BladeFlow>> alltaskList(@Parameter(description = "鍏抽敭瀛�") String keyword, Query query) {
+		IPage<BladeFlow> pages = businessService.selectAllTaskPage(Condition.getPage(query), keyword);
+		return R.data(pages);
+	}
+
+	@Operation(summary = "杞淳浠诲姟", description = "")
+	@PostMapping("transferTask")
+	public R<Void> transferTask(String taskId,String newAssigneeId, String processInstanceId, String comment, @RequestBody Map<String, Object> variables) {
+		// 澧炲姞璇勮
+		if (StringUtil.isNoneBlank(processInstanceId, comment)) {
+			taskService.addComment(taskId, processInstanceId, comment);
+		}
+		// 闈炵┖鍒ゆ柇
+		if (Func.isEmpty(variables)) {
+			variables = Kv.create();
+		}
+		// 瀹屾垚浠诲姟
+		taskService.setAssignee(taskId, newAssigneeId);
+		return R.success("娴佺▼杞淳鎴愬姛");
+	}
+
 }
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 529e9e8..0ab7275 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
@@ -70,7 +70,7 @@
 		String userId = ""+AuthUtil.getUserId();
 		List<BladeFlow> flowList = new LinkedList<>();
 
-		TaskQuery todoQuery = taskService.createTaskQuery().taskAssignee("1930600500876619777").active().includeProcessVariables();
+		TaskQuery todoQuery = taskService.createTaskQuery().taskAssignee(userId).active().includeProcessVariables();
 
 		if(Func.isNotEmpty(keyword)){
 			todoQuery.or();
@@ -344,4 +344,42 @@
 		return historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
 	}
 
+	public IPage<BladeFlow> selectAllTaskPage(IPage<BladeFlow> page, String keyword) {
+
+		List<BladeFlow> 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();
+		}
+
+		todoQuery.orderByTaskCreateTime().desc();
+
+		// 鏋勫缓鍒楄〃鏁版嵁
+		BladeFlow bladeFlow = new BladeFlow();
+		buildFlowTaskList(bladeFlow, flowList, todoQuery, "todo");//FlowEngineConstant.STATUS_TODO
+
+		// 璁$畻鎬绘暟
+		long count = todoQuery.count();
+		// 璁剧疆椤垫暟
+		page.setSize(count);
+		// 璁剧疆鎬绘暟
+		page.setTotal(count);
+		// 璁剧疆鏁版嵁
+		page.setRecords(flowList);
+		return page;
+	}
 }
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 109f35d..549a53d 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
@@ -7,11 +7,32 @@
     <userTask id="programmingTask" name="缂栧埗" flowable:assignee="${programmer}"/>
     <sequenceFlow id="sid-ac678e85-9f7b-4e8d-903f-2591ea7721ab" sourceRef="teamLeaderTask" targetRef="programmingTask"/>
     <userTask id="check" name="鏍″" flowable:assignee="${checker}"/>
-    <sequenceFlow id="sid-6c33a84d-d03e-47f6-87c1-8e676b25e572" sourceRef="programmingTask" targetRef="check"/>
-    <userTask id="approveTask" name="楂樺笀瀹℃壒"/>
-    <sequenceFlow id="sid-2e73fc3f-6802-4a94-984c-e1b9a50f8489" sourceRef="check" targetRef="approveTask"/>
+    <sequenceFlow id="sid-6c33a84d-d03e-47f6-87c1-8e676b25e572" sourceRef="programmingTask" targetRef="programGateway"/>
+    <userTask id="approveTask" name="楂樺笀瀹℃壒" flowable:assignee="${senior}"/>
+    <sequenceFlow id="toCheckApproveGateway" sourceRef="check" targetRef="checkApproveGateway" name="鏍″瀹℃壒鍒ゆ柇缃戝叧"/>
     <endEvent id="approveEnd" name="瀹℃壒瀹屾垚"/>
-    <sequenceFlow id="sid-1a414739-a80f-4436-8d7a-e7b65fae8233" sourceRef="approveTask" targetRef="approveEnd"/>
+    <sequenceFlow id="sid-1a414739-a80f-4436-8d7a-e7b65fae8233" sourceRef="approveTask" targetRef="seriorApproveGateway"/>
+    <exclusiveGateway id="programGateway" name="缂栧埗瀹屾垚鍒ゆ柇缃戝叧"/>
+    <sequenceFlow id="programingToCheck" sourceRef="programGateway" targetRef="check" name="缂栧埗瀹屾垚缁欐牎瀵�">
+      <conditionExpression xsi:type="tFormalExpression">${approve=='Y'}</conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="programingBackToLeader" sourceRef="programGateway" targetRef="teamLeaderTask" name="缂栧埗椹冲洖">
+      <conditionExpression xsi:type="tFormalExpression">${approve=='N'}</conditionExpression>
+    </sequenceFlow>
+    <exclusiveGateway id="checkApproveGateway" name="鏍″瀹℃壒鍒ゆ柇缃戝叧"/>
+    <sequenceFlow id="flowCheckToPrograming" sourceRef="checkApproveGateway" targetRef="programmingTask" name="flow鏍″椹冲洖鍒扮紪鍒�">
+      <conditionExpression xsi:type="tFormalExpression">${approve=='N'}</conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="flowToSeriorTask" sourceRef="checkApproveGateway" targetRef="approveTask" name="鍒伴珮甯堝鎵�">
+      <conditionExpression xsi:type="tFormalExpression">${approve=='Y'}</conditionExpression>
+    </sequenceFlow>
+    <exclusiveGateway id="seriorApproveGateway" name="楂樺笀鍒ゆ柇缃戝叧"/>
+    <sequenceFlow id="sid-c0b195e7-17e5-44bf-8115-8b7126cb3ab3" sourceRef="seriorApproveGateway" targetRef="approveEnd">
+      <conditionExpression xsi:type="tFormalExpression">${approve=='Y'}</conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="sid-03430665-d042-46b3-ab65-5ecde104ce8e" sourceRef="seriorApproveGateway" targetRef="check">
+      <conditionExpression xsi:type="tFormalExpression"/>
+    </sequenceFlow>
   </process>
   <bpmndi:BPMNDiagram id="BPMNDiagram_dispatch">
     <bpmndi:BPMNPlane bpmnElement="dispatch" id="BPMNPlane_dispatch">
@@ -20,38 +41,71 @@
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="edge-5783eb04-78a8-4bde-b8bb-c12d28f07609" bpmnElement="sid-c1619263-d1ff-4106-9315-f9ab9a3bee71">
         <omgdi:waypoint x="-290.0" y="-92.5"/>
-        <omgdi:waypoint x="-185.0" y="-75.0"/>
+        <omgdi:waypoint x="-240.0" y="-92.5"/>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="shape-720b1ec1-043e-4a8a-bc4d-c50cf01678d7" bpmnElement="teamLeaderTask">
-        <omgdc:Bounds x="-185.0" y="-115.0" width="100.0" height="80.0"/>
+        <omgdc:Bounds x="-240.0" y="-125.0" width="70.0" height="65.0"/>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="shape-b1baea86-1882-4c5c-886f-44e3d9be3746" bpmnElement="programmingTask">
-        <omgdc:Bounds x="-20.0" y="-115.0" width="100.0" height="80.0"/>
+        <omgdc:Bounds x="-115.0" y="-122.5" width="85.0" height="60.0"/>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="edge-0079d499-1c0d-4745-9886-40df39794833" bpmnElement="sid-ac678e85-9f7b-4e8d-903f-2591ea7721ab">
-        <omgdi:waypoint x="-85.0" y="-75.0"/>
-        <omgdi:waypoint x="-20.0" y="-75.0"/>
+        <omgdi:waypoint x="-170.0" y="-92.5"/>
+        <omgdi:waypoint x="-115.0" y="-92.5"/>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="shape-9237838e-5de2-4db7-8d46-3f4a69de7e6e" bpmnElement="check">
-        <omgdc:Bounds x="105.0" y="-115.0" width="100.0" height="80.0"/>
+        <omgdc:Bounds x="85.0" y="-120.0" width="60.0" height="55.0"/>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="edge-72007fd8-6ed8-402f-8bbc-81bd6c856fa7" bpmnElement="sid-6c33a84d-d03e-47f6-87c1-8e676b25e572">
-        <omgdi:waypoint x="80.0" y="-55.0"/>
-        <omgdi:waypoint x="105.0" y="-95.0"/>
+        <omgdi:waypoint x="-30.0" y="-77.5"/>
+        <omgdi:waypoint x="-30.0" y="-15.0"/>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="shape-a42e90ff-9c82-4d5b-8f5b-0804754e89a6" bpmnElement="approveTask">
-        <omgdc:Bounds x="15.0" y="16.0" width="100.0" height="80.0"/>
+        <omgdc:Bounds x="130.0" y="1.0" width="50.0" height="45.0"/>
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="edge-7fe1281a-3bbf-4308-90a5-cbf70aa019dd" bpmnElement="sid-2e73fc3f-6802-4a94-984c-e1b9a50f8489">
-        <omgdi:waypoint x="130.0" y="-35.0"/>
-        <omgdi:waypoint x="90.0" y="16.0"/>
+      <bpmndi:BPMNEdge id="edge-7fe1281a-3bbf-4308-90a5-cbf70aa019dd" bpmnElement="toCheckApproveGateway">
+        <omgdi:waypoint x="145.0" y="-92.5"/>
+        <omgdi:waypoint x="240.0" y="-30.0"/>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="shape-f14acaf6-9747-4d52-87a1-d4c5b8f3d166" bpmnElement="approveEnd">
-        <omgdc:Bounds x="205.0" y="41.0" width="30.0" height="30.0"/>
+        <omgdc:Bounds x="245.0" y="51.0" width="30.0" height="30.0"/>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="edge-9cb8c108-2b94-4e39-b7ed-93ff0d86fe73" bpmnElement="sid-1a414739-a80f-4436-8d7a-e7b65fae8233">
-        <omgdi:waypoint x="115.0" y="56.0"/>
-        <omgdi:waypoint x="205.0" y="56.0"/>
+        <omgdi:waypoint x="130.0" y="34.75"/>
+        <omgdi:waypoint x="55.0" y="70.0"/>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="shape-b505d942-4475-416a-aec6-c02164e6ee05" bpmnElement="programGateway">
+        <omgdc:Bounds x="-50.0" y="-15.0" width="40.0" height="40.0"/>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="edge-6f05f47f-7804-4dd0-b6d2-e435b9efaa3c" bpmnElement="programingToCheck">
+        <omgdi:waypoint x="-10.0" y="5.0"/>
+        <omgdi:waypoint x="85.0" y="-78.75"/>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="edge-b38a8021-a54d-4671-aaf2-408bdbbbd374" bpmnElement="programingBackToLeader">
+        <omgdi:waypoint x="-50.0" y="5.0"/>
+        <omgdi:waypoint x="-170.0" y="-76.25"/>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="shape-b113f604-a178-455b-9518-9f4953322948" bpmnElement="checkApproveGateway">
+        <omgdc:Bounds x="220.0" y="-30.0" width="40.0" height="40.0"/>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="edge-c2232174-4a73-4c39-ac85-fc3854f0f18c" bpmnElement="flowCheckToPrograming">
+        <omgdi:waypoint x="220.0" y="-10.0"/>
+        <omgdi:waypoint x="-30.0" y="-92.5"/>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="edge-d05b5f9f-9108-4a41-9e48-4db1e1b1e325" bpmnElement="flowToSeriorTask">
+        <omgdi:waypoint x="240.0" y="10.0"/>
+        <omgdi:waypoint x="180.0" y="12.25"/>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="shape-6be62567-0538-4a4f-b3ce-e819d7182666" bpmnElement="seriorApproveGateway">
+        <omgdc:Bounds x="35.0" y="70.0" width="40.0" height="40.0"/>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="edge-715efa53-6c03-407b-87ec-640f99c481a0" bpmnElement="sid-c0b195e7-17e5-44bf-8115-8b7126cb3ab3">
+        <omgdi:waypoint x="75.0" y="90.0"/>
+        <omgdi:waypoint x="245.0" y="73.5"/>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="edge-782277fd-866f-44d5-9046-af7c34c4b85c" bpmnElement="sid-03430665-d042-46b3-ab65-5ecde104ce8e">
+        <omgdi:waypoint x="35.0" y="90.0"/>
+        <omgdi:waypoint x="100.0" y="-65.0"/>
       </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
diff --git a/blade-service/blade-mdm/src/main/resources/processesbpmn/program-cure.bpmn20.xml b/blade-service/blade-mdm/src/main/resources/processesbpmn/program-cure.bpmn20.xml
new file mode 100644
index 0000000..2e88c8f
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/resources/processesbpmn/program-cure.bpmn20.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.flowable.org/processdef">
+  <process id="program-cure" name="鍥哄寲娴佺▼" isExecutable="true">
+    <startEvent id="sid-abe970b9-1bee-49a1-91b4-1184c47c10b7"/>
+    <userTask id="sid-e9be5408-2827-4ee7-bee5-fda38a8f23e6"/>
+    <sequenceFlow id="sid-910649a5-8dac-48a2-b42d-9f1132d61b26" sourceRef="sid-e9be5408-2827-4ee7-bee5-fda38a8f23e6" targetRef="sid-e9be5408-2827-4ee7-bee5-fda38a8f23e6"/>
+    <sequenceFlow id="sid-09c7cf44-bb1a-40f4-b231-919afae5c02f" sourceRef="sid-abe970b9-1bee-49a1-91b4-1184c47c10b7" targetRef="sid-e9be5408-2827-4ee7-bee5-fda38a8f23e6"/>
+    <endEvent id="end" name="鍥哄寲缁撴潫"/>
+    <userTask id="seniorApproveTask" name="楂樺笀瀹℃牳"/>
+    <sequenceFlow id="sid-8dd21f02-ac10-4318-b897-19b4cdc558c7" sourceRef="sid-e9be5408-2827-4ee7-bee5-fda38a8f23e6" targetRef="seniorApproveTask"/>
+    <sequenceFlow id="sid-504610fe-2b87-4df4-8f42-f10c8bf3ce01" sourceRef="seniorApproveTask" targetRef="end"/>
+  </process>
+  <bpmndi:BPMNDiagram id="BPMNDiagram_program-cure">
+    <bpmndi:BPMNPlane bpmnElement="program-cure" id="BPMNPlane_program-cure">
+      <bpmndi:BPMNShape id="shape-7fe43876-cd89-402e-aada-b7fe7d89e64a" bpmnElement="sid-abe970b9-1bee-49a1-91b4-1184c47c10b7">
+        <omgdc:Bounds x="-215.0" y="-85.0" width="30.0" height="30.0"/>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="shape-702fceb1-2073-4a25-a94d-86c2392dfc6f" bpmnElement="sid-e9be5408-2827-4ee7-bee5-fda38a8f23e6">
+        <omgdc:Bounds x="-110.0" y="-95.0" width="75.0" height="55.0"/>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="edge-fbb946ca-a477-4237-b78f-72cf4e0b8479" bpmnElement="sid-910649a5-8dac-48a2-b42d-9f1132d61b26">
+        <omgdi:waypoint x="-110.0" y="-67.5"/>
+        <omgdi:waypoint x="-110.0" y="-67.5"/>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="edge-53030742-9070-4825-949f-edc502019050" bpmnElement="sid-09c7cf44-bb1a-40f4-b231-919afae5c02f">
+        <omgdi:waypoint x="-185.0" y="-77.5"/>
+        <omgdi:waypoint x="-110.0" y="-81.25"/>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="shape-99ebb425-cb2f-45f3-93e2-4ca390bc8099" bpmnElement="end">
+        <omgdc:Bounds x="190.0" y="-82.5" width="30.0" height="30.0"/>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="shape-b464ad8c-9ec6-4e35-bfa5-c062c91b646a" bpmnElement="seniorApproveTask">
+        <omgdc:Bounds x="25.0" y="-95.0" width="65.0" height="35.0"/>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="edge-94601323-c6bd-48f8-94fd-f61c6b550126" bpmnElement="sid-8dd21f02-ac10-4318-b897-19b4cdc558c7">
+        <omgdi:waypoint x="-35.0" y="-67.5"/>
+        <omgdi:waypoint x="25.0" y="-68.75"/>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="edge-b93559c6-90f6-46e1-a6e6-4b0a2a5bc33b" bpmnElement="sid-504610fe-2b87-4df4-8f42-f10c8bf3ce01">
+        <omgdi:waypoint x="90.0" y="-68.75"/>
+        <omgdi:waypoint x="190.0" y="-67.5"/>
+      </bpmndi:BPMNEdge>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</definitions>
diff --git a/doc/sql/mdm/mdm.all.create.sql b/doc/sql/mdm/mdm.all.create.sql
index 27fbbd2..d4e995c 100644
--- a/doc/sql/mdm/mdm.all.create.sql
+++ b/doc/sql/mdm/mdm.all.create.sql
@@ -20,7 +20,7 @@
   `code` varchar(100) NOT NULL COMMENT '鏈哄簥缂栧彿',
   `name` varchar(100) NOT NULL COMMENT '鏈哄簥鎻忚堪/鍨嬪彿',
   `avatar` varchar(400) DEFAULT NULL COMMENT '鍥剧墖鍦板潃',
-  `machine_group_id` bigint NOT NULL COMMENT '鎵�灞炴満搴婄粍ID',
+  `machine_group_code` varchar(255) NOT NULL COMMENT '鎵�灞炴満搴婄粍浠g爜锛�,鍦ㄤ笟鍔″瓧鍏搁厤缃紙key=machine_group锛�',
   `machine_spec` varchar(20) DEFAULT NULL COMMENT '鏈哄櫒瑙勬牸:01杞﹀簥/02閾e簥,鍦ㄤ笟鍔″瓧鍏搁厤缃紙key=machine_spec锛�',
   `operator` varchar(100)  COMMENT '鎿嶄綔鍛橈紝鏂囨湰褰曞叆',
   `owner_dept` bigint DEFAULT NULL COMMENT '鎵�灞炲崟浣�/缁勭粐',
@@ -60,25 +60,63 @@
     UNIQUE KEY `uniqueCheckIndex` (`team_leader_id`,`programmer_id`,`checker_id`,`senior_id`,`is_deleted`) USING BTREE
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_general_ci  ROW_FORMAT=DYNAMIC COMMENT='涓诲埗璁″垝琛�';
 
+
+CREATE TABLE `mdm_nc_node` (
+          `id` bigint NOT NULL,
+          `tenant_id` varchar(6) DEFAULT NULL COMMENT '鎵�灞炵鎴�',
+          `name` varchar(100) NOT NULL COMMENT '鑺傜偣鍚嶇О',
+          `parent_id` bigint DEFAULT NULL COMMENT '鎵�灞炴満搴婄粍ID',
+          `node_type` varchar(20) DEFAULT NULL COMMENT '鑺傜偣绫诲瀷锛歅RODUCT_MODEL(浜у搧鍨嬪彿)/PARTS_NO(闆剁粍浠跺彿)/CRAFT_EDITION(宸ヨ壓鐗堟)/PROCESS_NO(宸ュ簭鍙�)/MACHINE(鏈哄簥)/PACKAGE(绋嬪簭鍖呭悕)/PROGRAME(绋嬪簭鏂囦欢)',
+          `status` int DEFAULT NULL COMMENT '涓氬姟鐘舵��',
+          `create_dept` bigint DEFAULT NULL COMMENT '鍒涘缓鍗曚綅',
+          `is_deleted` int DEFAULT NULL,
+          `create_time` datetime DEFAULT NULL COMMENT '鍒涘缓鏃堕棿',
+          `create_user` bigint DEFAULT NULL COMMENT '鍒涘缓浜�',
+          `update_time` datetime DEFAULT NULL COMMENT '鏇存柊鏃堕棿',
+          `update_user` bigint DEFAULT NULL COMMENT '鏇存柊浜�'
+  PRIMARY KEY (`id`) USING BTREE,
+                                  UNIQUE KEY `uniqueCodeIndex` (`code`,`is_deleted`) USING BTREE,
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='绋嬪簭鑺傜偣鐩綍';
+
 CREATE TABLE `mdm_nc_program` (
   `id` bigint NOT NULL,
   `tenant_id` varchar(6) DEFAULT NULL COMMENT '鎵�灞炵鎴�',
+  `nc_node_id` bigint DEFAULT NULL COMMENT '鎵�灞炶妭鐐筰d',
   `code` varchar(100) NOT NULL COMMENT '绋嬪簭缂栧彿',
   `name` varchar(100) NOT NULL COMMENT '绋嬪簭鍚嶇О',
-  `machine_group_id` bigint DEFAULT NULL COMMENT '鎵�灞炴満搴婄粍ID',
-  `flow_task_id` bigint DEFAULT NULL COMMENT '浠诲姟ID锛屾帴鏀朵笅鍙戜换鍔℃椂纭畾鐨勪换鍔d锛岄潪娴佺▼绀轰緥id',
+  `package_name` varchar(100) NOT NULL COMMENT '绋嬪簭鍖呭悕',
+  `machine_code` bigint DEFAULT NULL COMMENT '璁惧缂栧彿/鏈哄簥缂栧彿',
   `is_cured` int DEFAULT NULL COMMENT '鏄惁鍥哄寲,1鏄�;0鍚�',
+  `expire_date` date DEFAULT NULL COMMENT '鍒版湡鏃堕棿,鏍规嵁鏈夋晥鏈熸椂闀胯绠楄�屾潵',
+  `process_edition` varchar(40) DEFAULT NULL COMMENT '宸ュ簭鐗堟锛屽崌鐗堝氨鏄彉鏇存敼璇ュ瓧娈碉紝闇�瑕佷繚鐣欏巻鍙茶褰�',
+  `is_last_edition` int NOT NULL COMMENT '鏄惁鏈�鏂扮増娆★紝1锛氭渶鏂扮増娆★紱0:鍘嗗彶鐗堟锛屼富瑕佸彇璇ュ瓧娈�=1鐨勬暟鎹紝0鏄巻鍙茬増娆�',
+  `is_locked` int DEFAULT NULL COMMENT '閿佸畾鐘舵�侊紝1锛氶攣瀹氾紱0:姝e父',
   `status` int DEFAULT NULL COMMENT '涓氬姟鐘舵��',
   `create_dept` bigint DEFAULT NULL COMMENT '鍒涘缓鍗曚綅',
   `is_deleted` int DEFAULT NULL,
   `create_time` datetime DEFAULT NULL COMMENT '鍒涘缓鏃堕棿',
   `create_user` bigint DEFAULT NULL COMMENT '鍒涘缓浜�',
   `update_time` datetime DEFAULT NULL COMMENT '鏇存柊鏃堕棿',
-  `update_user` bigint DEFAULT NULL COMMENT '鏇存柊浜�'
-  PRIMARY KEY (`id`) USING BTREE,
-  UNIQUE KEY `uniqueCodeIndex` (`code`,`is_deleted`) USING BTREE,
+  `update_user` bigint DEFAULT NULL COMMENT '鏇存柊浜�',
+  PRIMARY KEY (`id`) USING BTREE
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='鏁版帶绋嬪簭';
 
+CREATE TABLE `mdm_nc_program_file` (
+  `id` bigint NOT NULL,
+  `tenant_id` varchar(6) DEFAULT NULL COMMENT '鎵�灞炵鎴�',
+  `program_id` varchar(100) NOT NULL COMMENT '鎵�灞炵▼搴廼d',
+  `name` varchar(100) NOT NULL COMMENT '鏂囦欢鍚嶇О',
+  `url` varchar(100) NOT NULL COMMENT '鏂囦欢鍦板潃',
+  `status` int DEFAULT NULL COMMENT '涓氬姟鐘舵��',
+  `create_dept` bigint DEFAULT NULL COMMENT '鍒涘缓鍗曚綅',
+  `is_deleted` int DEFAULT NULL,
+  `create_time` datetime DEFAULT NULL COMMENT '鍒涘缓鏃堕棿',
+  `create_user` bigint DEFAULT NULL COMMENT '鍒涘缓浜�',
+  `update_time` datetime DEFAULT NULL COMMENT '鏇存柊鏃堕棿',
+  `update_user` bigint DEFAULT NULL COMMENT '鏇存柊浜�',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='鏁版帶绋嬪簭鏂囦欢';
+
 
 CREATE TABLE `mdm_task_receive` (
   `id` bigint NOT NULL,

--
Gitblit v1.9.3