From ed9f1d757d6d3486dd69a726454eb69c3c9bc538 Mon Sep 17 00:00:00 2001
From: lyh <liuyuanheng@xalxzn.com>
Date: 星期二, 25 二月 2025 11:28:04 +0800
Subject: [PATCH] flowable工作流 config配置

---
 lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml                                          |    1 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/ext/AssignFileStreamExt.java                                    |   19 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/IAssignFileStreamService.java                           |   95 ++
 lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/impl/ActivitiSignExamineServiceimpl.java                |   11 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/IToEquipmentTaskService.java                            |    7 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/request/AssignFileStreamQueryRequest.java                       |   17 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/entity/ActivitiSignExamine.java                                 |   53 +
 lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/mapper/xml/AssignFileStreamMapper.xml                           |   89 ++
 lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/mapper/ActivitiDefinitionMapper.java                            |    7 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IMdcProductionService.java         |    8 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/impl/ToEquipmentTaskServiceImpl.java                    |   11 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/MdcProductionMapper.java            |    7 
 lxzn-module-system/lxzn-system-start/src/main/resources/application.yml                                              |    2 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/request/AssignFileRequest.java                                  |   16 
 lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/service/FlowCommonService.java                |    7 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/mapper/ActivitiSignExamineMapper.java                           |    7 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/IActivitiDefinitionService.java                         |   60 +
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/MdcProductionMapper.xml         |   13 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/request/TaskRequest.java                                        |   13 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/request/ActivitiDefinitionRequest.java                          |   11 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/IActivitiSignExamineService.java                        |    9 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/request/ApproveBatchRequest.java                                |   15 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/mapper/AssignFileStreamMapper.java                              |   26 
 lxzn-module-flowable/pom.xml                                                                                         |   18 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/mapper/ToEquipmentTaskMapper.java                               |    7 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/impl/AssignFileStreamServiceImpl.java                   |  788 ++++++++++++++++++++++++
 lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/entity/ToEquipmentTask.java                                     |   62 +
 /dev/null                                                                                                            |   21 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/ext/ActTaskExt.java                                             |   16 
 lxzn-module-system/lxzn-system-start/src/main/java/org/jeecg/JeecgSystemApplication.java                             |    3 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/controller/AssignFileStreamController.java                      |  111 +++
 lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/impl/ActivitiDefinitionServiceImpl.java                 |  150 ++++
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcProductionServiceImpl.java |   20 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/entity/ActivitiDefinition.java                                  |   44 +
 lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/entity/AssignFileStream.java                                    |   75 ++
 lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/config/FlowableConfig.java                             |   65 ++
 36 files changed, 1,855 insertions(+), 29 deletions(-)

diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/controller/AssignFileStreamController.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/controller/AssignFileStreamController.java
new file mode 100644
index 0000000..c989068
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/controller/AssignFileStreamController.java
@@ -0,0 +1,111 @@
+package org.jeecg.modules.flow.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.modules.flow.service.IAssignFileStreamService;
+import org.jeecg.modules.flow.entity.AssignFileStream;
+import org.jeecg.modules.flow.ext.AssignFileStreamExt;
+import org.jeecg.modules.flow.request.ApproveBatchRequest;
+import org.jeecg.modules.flow.request.AssignFileRequest;
+import org.jeecg.modules.flow.request.AssignFileStreamQueryRequest;
+import org.jeecg.modules.dnc.response.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@Slf4j
+@Api(tags = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔")
+@RestController
+@RequestMapping("/nc/activit")
+public class AssignFileStreamController  {
+    @Resource
+    private IAssignFileStreamService assignFileStreamService;
+
+    @AutoLog(value = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-鍚姩娴佺▼ 淇濆瓨鐩稿簲鐨勬暟鎹� 缁戝畾businessKey")
+    @ApiOperation(value = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-鍚姩娴佺▼ 淇濆瓨鐩稿簲鐨勬暟鎹� 缁戝畾businessKey", notes = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-鍚姩娴佺▼ 淇濆瓨鐩稿簲鐨勬暟鎹� 缁戝畾businessKey")
+    @PostMapping("/assign/file/apply")
+    public ResponseResult applyAssignFile(@RequestBody AssignFileStream stream) {
+        ResponseResult b = assignFileStreamService.applyAssignFile(stream);
+        if(b.isSuccess()) {
+            return new ResponseResult(CommonCode.SUCCESS);
+        }
+        return b;
+    }
+
+    @AutoLog(value = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-瀹℃壒鏈嶅姟")
+    @ApiOperation(value = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-瀹℃壒鏈嶅姟", notes = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-瀹℃壒鏈嶅姟")
+    @PostMapping("/assign/file/approve/{taskId}/{streamId}")
+    public ResponseResult approveAssignFile(@PathVariable("taskId") String taskId, @PathVariable("streamId") String streamId,
+                                            @RequestBody AssignFileStream stream) {
+        boolean b = assignFileStreamService.approveAssignFile(taskId, streamId, stream);
+        if(b)
+            return new ResponseResult(CommonCode.SUCCESS);
+        return new ResponseResult(CommonCode.FAIL);
+    }
+
+//    @AutoLog(value = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-鑾峰彇褰撳墠鐢ㄦ埛鐨勫緟鍔炲強鍙嬀鍙栫殑浠诲姟")
+//    @ApiOperation(value = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-鑾峰彇褰撳墠鐢ㄦ埛鐨勫緟鍔炲強鍙嬀鍙栫殑浠诲姟", notes = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-鑾峰彇褰撳墠鐢ㄦ埛鐨勫緟鍔炲強鍙嬀鍙栫殑浠诲姟")
+//    @GetMapping("/find/task/list")
+//    public Result<?> getUndoTaskList(@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+//                                                               @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
+//        IPage<ActTaskExt> actTaskExtIPage = assignFileStreamService.getUndoTaskList(pageNo,pageSize);
+//        return Result.ok(actTaskExtIPage);
+//    }
+
+    @AutoLog(value = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-鎵归噺鎸囨淳鍒拌澶�")
+    @ApiOperation(value = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-鎵归噺鎸囨淳鍒拌澶�", notes = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-鎵归噺鎸囨淳鍒拌澶�")
+    @PostMapping("/assign/file/batch/apply")
+    public ResponseResult applyBatchAssignFile(@RequestBody AssignFileRequest assignFileRequest) {
+        boolean b = assignFileStreamService.applyBatchAssignFile(assignFileRequest);
+        if(b)
+            return new ResponseResult(CommonCode.SUCCESS);
+        return new ResponseResult(CommonCode.FAIL);
+    }
+
+    @AutoLog(value = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-鎵归噺瀹℃壒")
+    @ApiOperation(value = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-鎵归噺瀹℃壒", notes = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-鎵归噺瀹℃壒")
+    @PostMapping("/assign/file/batch/approve")
+    public ResponseResult approveBatchAssignFile(@RequestBody ApproveBatchRequest approveBatchRequest) {
+        boolean b = assignFileStreamService.approveBatchAssignFile(approveBatchRequest);
+        if(b)
+            return new ResponseResult(CommonCode.SUCCESS);
+        return new ResponseResult(CommonCode.FAIL);
+    }
+
+    @AutoLog(value = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-宸插姙鍒楄〃鑾峰彇")
+    @ApiOperation(value = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-宸插姙鍒楄〃鑾峰彇", notes = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-宸插姙鍒楄〃鑾峰彇")
+    @GetMapping("/find/page")
+    public Result<?> findPageList(@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                                     @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, AssignFileStreamQueryRequest request) {
+        return assignFileStreamService.findPageList(pageNo, pageSize, request);
+    }
+
+    @AutoLog(value = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-鏌ヨ鏂囨。鐨勫鎵硅褰�")
+    @ApiOperation(value = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-鏌ヨ鏂囨。鐨勫鎵硅褰�", notes = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-鏌ヨ鏂囨。鐨勫鎵硅褰�")
+    @GetMapping("/find/page/{page}/{size}/{docId}")
+    public QueryPageResponseResult<AssignFileStreamExt> findPageListByDocId(@PathVariable("page") int page, @PathVariable("size") int size, @PathVariable("docId") String docId) {
+        return assignFileStreamService.findPageListByDocId(page, size, docId);
+    }
+
+    @AutoLog(value = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-鑾峰彇鍚敤娴佺▼鐨勬爣璁�")
+    @ApiOperation(value = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-鑾峰彇鍚敤娴佺▼鐨勬爣璁�", notes = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-鑾峰彇鍚敤娴佺▼鐨勬爣璁�")
+    @GetMapping("/get/enable/flag")
+    public DataResponseResult<Boolean> getActiveEnable() {
+        Boolean b = assignFileStreamService.getFlowableEnable();
+        return new DataResponseResult<>(CommonCode.SUCCESS, b);
+    }
+
+    @AutoLog(value = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-鎵爜浼犺緭绋嬪簭 涓嶇粡杩囧鎵� 鏂囦欢瀛樺湪閲囩敤瑕嗙洊")
+    @ApiOperation(value = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-鎵爜浼犺緭绋嬪簭 涓嶇粡杩囧鎵� 鏂囦欢瀛樺湪閲囩敤瑕嗙洊", notes = "DNC鎸囨淳璁惧娴佺▼鎿嶄綔-鎵爜浼犺緭绋嬪簭 涓嶇粡杩囧鎵� 鏂囦欢瀛樺湪閲囩敤瑕嗙洊")
+    @PostMapping("/transfer/doc")
+    public ResponseResult transferDocFile(String pnCode, String deviceNo) {
+        boolean b = assignFileStreamService.transferDocFile(pnCode, deviceNo);
+        if(b)
+            return new ResponseResult(CommonCode.SUCCESS);
+        return new ResponseResult(CommonCode.FAIL);
+    }
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/entity/ActivitiDefinition.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/entity/ActivitiDefinition.java
new file mode 100644
index 0000000..469c30a
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/entity/ActivitiDefinition.java
@@ -0,0 +1,44 @@
+package org.jeecg.modules.flow.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import io.swagger.annotations.Api;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.jeecg.common.aspect.annotation.Dict;
+
+import java.util.Date;
+
+@Data
+@NoArgsConstructor
+@TableName("nc_activiti_definition_info")
+@Api(value= "DNC鎸囨淳璁惧娴佺▼瀹氫箟")
+public class ActivitiDefinition {
+    @TableId(value = "id")
+    private String id;
+    @TableField(value = "act_name")
+    private String actName;
+    @TableField(value = "depart_id")
+    @Dict(dictTable = "mdc_production",dicCode = "id",dicText = "production_name")
+    private String departId;
+    @TableField(value = "approve_users")
+    @Dict(dictTable = "sys_user", dicCode = "id", dicText = "realname")
+    private String approveUsers;
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    @TableField(value = "create_time", fill = FieldFill.INSERT)
+    private Date createTime;
+    @TableField(value = "update_time", fill = FieldFill.UPDATE)
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date updateTime;
+    @JsonIgnore
+    @TableField(value = "create_user", select = false, fill = FieldFill.INSERT)
+    private String createUser;
+    @JsonIgnore
+    @TableField(value = "update_user", select = false, fill = FieldFill.UPDATE)
+    private String updateUser;
+    @JsonIgnore
+    @TableLogic
+    @TableField(value = "delete_flag", select = false)
+    private Integer deleteFlag = 0;
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/entity/ActivitiSignExamine.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/entity/ActivitiSignExamine.java
new file mode 100644
index 0000000..8fc31cd
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/entity/ActivitiSignExamine.java
@@ -0,0 +1,53 @@
+package org.jeecg.modules.flow.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import io.swagger.annotations.Api;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.jeecg.common.aspect.annotation.Dict;
+
+import java.util.Date;
+
+@Data
+@NoArgsConstructor
+@TableName("nc_assign_to_sign_examine")
+@Api(value= "NC绋嬪簭绛炬淳娴佺▼瀹氫箟")
+public class ActivitiSignExamine {
+    @TableId(value = "id")
+    private String id;
+    @TableField(value = "act_name")
+    private String actName;
+    @TableField(value = "depart_id")
+    @Dict(dictTable = "mdc_production",dicCode = "id",dicText = "production_name")
+    private String departId;
+    @TableField(value = "proofreader_user")
+    @Dict(dictTable = "sys_user", dicCode = "id", dicText = "realname")
+    private String proofreaderUser;
+    @TableField(value = "approving_user")
+    @Dict(dictTable = "sys_user", dicCode = "id", dicText = "realname")
+    private String approveUser;
+    @TableField(value = "cutter_user")
+    @Dict(dictTable = "sys_user", dicCode = "id", dicText = "realname")
+    private String cutterUser;
+    @TableField(value = "typecast_user")
+    @Dict(dictTable = "sys_user", dicCode = "id", dicText = "realname")
+    private String typecastUser;
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    @TableField(value = "create_time", fill = FieldFill.INSERT)
+    private Date createTime;
+    @TableField(value = "update_time", fill = FieldFill.UPDATE)
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date updateTime;
+    @JsonIgnore
+    @TableField(value = "create_by", select = false, fill = FieldFill.INSERT)
+    private String createBy;
+    @JsonIgnore
+    @TableField(value = "update_by", select = false, fill = FieldFill.UPDATE)
+    private String updateBy;
+    @JsonIgnore
+    @TableLogic
+    @TableField(value = "delete_flag", select = false)
+    private Integer deleteFlag = 0;
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/entity/AssignFileStream.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/entity/AssignFileStream.java
new file mode 100644
index 0000000..a8a903d
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/entity/AssignFileStream.java
@@ -0,0 +1,75 @@
+package org.jeecg.modules.flow.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import io.swagger.annotations.Api;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.jeecg.common.aspect.annotation.Dict;
+
+import java.util.Date;
+
+@Data
+@NoArgsConstructor
+@TableName("nc_assign_file_stream")
+@Api(value= "DNC鎸囨淳璁惧娴佺▼鎿嶄綔")
+public class AssignFileStream {
+    @TableId(value = "stream_id")
+    private String streamId;
+    @TableField(value = "product_id")
+    private String productId;
+    @TableField(value = "component_id")
+    private String componentId;
+    @TableField(value = "parts_id")
+    private String partsId;
+    @TableField(value = "process_id")
+    private String processId;
+    @TableField(value = "step_id")
+    private String stepId;
+    @TableField(value = "doc_id")
+    private String docId;
+    @TableField(value = "file_id")
+    private String fileId;
+    @TableField(value = "device_id")
+    private String deviceId;
+    @TableField(value = "apply_user_id")
+    private String applyUserId;
+    @TableField(value = "apply_reason")
+    private String applyReason;
+    @TableField(value = "apply_time")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date applyTime;
+    @TableField(value = "approve_user_id")
+    private String approveUserId;
+    @TableField(value = "approve_content")
+    private String approveContent;
+    @TableField(value = "approve_time")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date approveTime;
+    @TableField(value = "status")
+    @Dict(dicCode = "dnc_assign_stream_status")
+    private Integer status;
+    @JsonIgnore
+    @TableField(value = "create_time", select = false, fill = FieldFill.INSERT)
+    private Date createTime;
+    @JsonIgnore
+    @TableField(value = "update_time", select = false, fill = FieldFill.UPDATE)
+    private Date updateTime;
+    @JsonIgnore
+    @TableField(value = "create_user", select = false, fill = FieldFill.INSERT)
+    private String createUser;
+    @JsonIgnore
+    @TableField(value = "update_user", select = false, fill = FieldFill.UPDATE)
+    private String updateUser;
+    @JsonIgnore
+    @TableLogic
+    @TableField(value = "delete_flag", select = false)
+    private Integer deleteFlag = 0;
+
+    /**鎸囨淳璁惧涓撶敤-鎵�灞濱D*/
+    private transient String attributionId;
+
+    /**鎸囨淳璁惧涓撶敤-鎵�灞瀟ype*/
+    private transient String attributionType;
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/entity/ToEquipmentTask.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/entity/ToEquipmentTask.java
new file mode 100644
index 0000000..5b2b23d
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/entity/ToEquipmentTask.java
@@ -0,0 +1,62 @@
+package org.jeecg.modules.flow.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+@Data
+@NoArgsConstructor
+@TableName("nc_to_equipment_lists")
+public class ToEquipmentTask {
+    @TableId(value = "code")
+    private String code;
+    @TableField(value = "doc_id")
+    private String docId;
+    @TableField(value = "file_id")
+    private String fileId;
+    @TableField(value = "device_id")
+    private String deviceId;
+    @TableField(value = "device_no")
+    private String deviceNo;
+    @TableField(value = "depart_id")
+    private String departId;
+    @TableField(value = "file_name")
+    private String fileName;
+    @TableField(value = "file_encode_name")
+    private String fileEncodeName;
+    @TableField(value = "file_path")
+    private String filePath;
+    @TableField(value = "file_suffix")
+    private String fileSuffix;
+    @TableField(value = "doc_version")
+    private String docVersion;
+    @TableField(value = "file_size")
+    private Long fileSize;
+    @TableField(value = "sync_flag")
+    private Integer syncFlag;
+    @TableField(value = "sync_time")
+    private Date syncTime;
+    @TableField(value = "apply_user")
+    private String applyUser;
+    @TableField(value = "apply_time")
+    private Date applyTime;
+    @JsonIgnore
+    @TableField(value = "create_time", select = false, fill = FieldFill.INSERT)
+    private Date createTime;
+    @JsonIgnore
+    @TableField(value = "update_time", select = false, fill = FieldFill.UPDATE)
+    private Date updateTime;
+    @JsonIgnore
+    @TableField(value = "create_user", select = false, fill = FieldFill.INSERT)
+    private String createUser;
+    @JsonIgnore
+    @TableField(value = "update_user", select = false, fill = FieldFill.UPDATE)
+    private String updateUser;
+    @JsonIgnore
+    @TableLogic
+    @TableField(value = "delete_flag", select = false)
+    private Integer deleteFlag = 0;
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/ext/ActTaskExt.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/ext/ActTaskExt.java
new file mode 100644
index 0000000..b0bc0c4
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/ext/ActTaskExt.java
@@ -0,0 +1,16 @@
+package org.jeecg.modules.flow.ext;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+@Data
+@NoArgsConstructor
+public class ActTaskExt {
+    private String id;
+    private String name;
+    private String processInstanceId;
+    private String assignee;
+    private String executionId;
+    private String processDefinitionId;
+    private String businessKey;
+    private AssignFileStreamExt assignFileStream;
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/ext/AssignFileStreamExt.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/ext/AssignFileStreamExt.java
new file mode 100644
index 0000000..642ae9d
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/ext/AssignFileStreamExt.java
@@ -0,0 +1,19 @@
+package org.jeecg.modules.flow.ext;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.jeecg.modules.flow.entity.AssignFileStream;
+
+@Data
+@NoArgsConstructor
+public class AssignFileStreamExt extends AssignFileStream {
+    private String productName;
+    private String componentName;
+    private String partsName;
+    private String docName;
+    private String version;
+    private String applyUser;
+    private String approveUser;
+    private String deviceName;
+    private String docSuffix;
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/mapper/ActivitiDefinitionMapper.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/mapper/ActivitiDefinitionMapper.java
new file mode 100644
index 0000000..054d02e
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/mapper/ActivitiDefinitionMapper.java
@@ -0,0 +1,7 @@
+package org.jeecg.modules.flow.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.flow.entity.ActivitiDefinition;
+
+public interface ActivitiDefinitionMapper extends BaseMapper<ActivitiDefinition> {
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/mapper/ActivitiSignExamineMapper.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/mapper/ActivitiSignExamineMapper.java
new file mode 100644
index 0000000..803a105
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/mapper/ActivitiSignExamineMapper.java
@@ -0,0 +1,7 @@
+package org.jeecg.modules.flow.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.flow.entity.ActivitiSignExamine;
+
+public interface ActivitiSignExamineMapper extends BaseMapper<ActivitiSignExamine> {
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/mapper/AssignFileStreamMapper.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/mapper/AssignFileStreamMapper.java
new file mode 100644
index 0000000..e6740ff
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/mapper/AssignFileStreamMapper.java
@@ -0,0 +1,26 @@
+package org.jeecg.modules.flow.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.flow.entity.AssignFileStream;
+import org.jeecg.modules.flow.ext.AssignFileStreamExt;
+
+public interface AssignFileStreamMapper extends BaseMapper<AssignFileStream> {
+    /**
+     * 鍏宠仈鐢ㄦ埛琛� 鑾峰彇鐢ㄦ埛鏄电О
+     * @param streamId
+     * @return
+     */
+    AssignFileStreamExt getAssignFileStreamDetail(@Param("streamId") String streamId);
+
+    /**
+     * 鍒嗛〉鏌ヨ宸插姙浠诲姟
+     * @param page
+     * @param wrapper
+     * @return
+     */
+    IPage<AssignFileStreamExt> findByPage(IPage<AssignFileStreamExt> page, @Param(Constants.WRAPPER) Wrapper<AssignFileStreamExt> wrapper);
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/mapper/ToEquipmentTaskMapper.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/mapper/ToEquipmentTaskMapper.java
new file mode 100644
index 0000000..8ff63d7
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/mapper/ToEquipmentTaskMapper.java
@@ -0,0 +1,7 @@
+package org.jeecg.modules.flow.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.flow.entity.ToEquipmentTask;
+
+public interface ToEquipmentTaskMapper extends BaseMapper<ToEquipmentTask> {
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/mapper/xml/AssignFileStreamMapper.xml b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/mapper/xml/AssignFileStreamMapper.xml
new file mode 100644
index 0000000..cdbc3cb
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/mapper/xml/AssignFileStreamMapper.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="org.jeecg.modules.flow.mapper.AssignFileStreamMapper">
+    <select id="getAssignFileStreamDetail" resultType="org.jeecg.modules.flow.ext.AssignFileStreamExt" parameterType="String">
+        select a.stream_id
+        , a.product_id
+        , a.component_id
+        , a.parts_id
+        , a.process_id
+        , a.doc_id
+        , a.file_id
+        , a.device_id
+        , a.apply_user_id
+        , a.apply_reason
+        , a.apply_time
+        , a.approve_user_id
+        , a.approve_content
+        , a.approve_time
+        , a.status
+        , u1.realname as applyUser
+        , u2.realname as approveUser
+        , p.product_name as productName
+        , c.component_name as componentName
+        , pt.parts_name as partsName
+        , dc.doc_name as docName
+        , dc.publish_version as version
+        , dc.doc_suffix as docSuffix
+        , de.device_name as deviceName
+        from (select * from nc_assign_file_stream where stream_id=#{streamId}) a
+        left join sys_user u1
+        on a.apply_user_id=u1.id
+        left join sys_user u2
+        on a.approve_user_id=u2.id
+        left join nc_product_info p
+        on a.product_id=p.product_id
+        left join nc_component_info c
+        on a.component_id=c.component_id
+        left join nc_parts_info pt
+        on a.parts_id=pt.parts_id
+        left join nc_doc_info dc
+        on a.doc_id=dc.doc_id
+        left join nc_device_info de
+        on a.device_id=de.device_id
+
+    </select>
+
+    <select id="findByPage" resultType="org.jeecg.modules.flow.ext.AssignFileStreamExt" parameterType="String">
+        select a.stream_id
+        , a.product_id
+        , a.component_id
+        , a.parts_id
+        , a.process_id
+        , a.doc_id
+        , a.file_id
+        , a.device_id
+        , a.apply_user_id
+        , a.apply_reason
+        , a.apply_time
+        , a.approve_user_id
+        , a.approve_content
+        , a.approve_time
+        , a.status
+        , u1.realname as applyUser
+        , u2.realname as approveUser
+        , p.product_name as productName
+        , c.component_name as componentName
+        , pt.parts_name as partsName
+        , dc.doc_name as docName
+        , dc.publish_version as version
+        , dc.doc_suffix as docSuffix
+        , de.device_name as deviceName
+        from (select * from nc_assign_file_stream where delete_flag=0 and approve_time is not null) a
+        left join sys_user u1
+        on a.apply_user_id=u1.id
+        left join sys_user u2
+        on a.approve_user_id=u2.id
+        left join nc_product_info p
+        on a.product_id=p.product_id
+        left join nc_component_info c
+        on a.component_id=c.component_id
+        left join nc_parts_info pt
+        on a.parts_id=pt.parts_id
+        left join nc_doc_info dc
+        on a.doc_id=dc.doc_id
+        left join nc_device_info de
+        on a.device_id=de.device_id
+        ${ew.customSqlSegment}
+    </select>
+</mapper>
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/request/ActivitiDefinitionRequest.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/request/ActivitiDefinitionRequest.java
new file mode 100644
index 0000000..d23079c
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/request/ActivitiDefinitionRequest.java
@@ -0,0 +1,11 @@
+package org.jeecg.modules.flow.request;
+
+import lombok.Data;
+
+@Data
+public class ActivitiDefinitionRequest {
+    private String actName;
+    //鎺掑簭瀛楁
+    private String descStr;
+    private String ascStr;
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/request/ApproveBatchRequest.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/request/ApproveBatchRequest.java
new file mode 100644
index 0000000..213ca8e
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/request/ApproveBatchRequest.java
@@ -0,0 +1,15 @@
+package org.jeecg.modules.flow.request;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+public class ApproveBatchRequest implements Serializable {
+    private String approveContent;
+    private Integer status;
+    private List<TaskRequest> taskArr;
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/request/AssignFileRequest.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/request/AssignFileRequest.java
new file mode 100644
index 0000000..645da28
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/request/AssignFileRequest.java
@@ -0,0 +1,16 @@
+package org.jeecg.modules.flow.request;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@NoArgsConstructor
+public class AssignFileRequest implements Serializable {
+    private String processId;
+    private String fileId;
+    private String docId;
+    private String applyReason;
+    private String[] deviceIds;
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/request/AssignFileStreamQueryRequest.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/request/AssignFileStreamQueryRequest.java
new file mode 100644
index 0000000..d6166bb
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/request/AssignFileStreamQueryRequest.java
@@ -0,0 +1,17 @@
+package org.jeecg.modules.flow.request;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@ApiModel(value = "宸插姙浠诲姟鏌ヨ鏉′欢", description = "宸插姙浠诲姟鏌ヨ")
+public class AssignFileStreamQueryRequest {
+    //鎺掑簭瀛楁
+    @ApiModelProperty(value = "闄嶅簭鎺掑垪", notes="鎺掑簭瀛楁涓烘暟鎹簱鍏蜂綋瀛楁鍚嶏紝闇�瑕佽В鏋愶紱 澶氫釜瀛楁浠ヨ嫳鏂囬�楀彿鍒嗛殧")
+    private String descStr;
+    @ApiModelProperty(value = "鍗囧簭鎺掑垪", notes="鎺掑簭瀛楁涓烘暟鎹簱鍏蜂綋瀛楁鍚嶏紝闇�瑕佽В鏋愶紱 澶氫釜瀛楁浠ヨ嫳鏂囬�楀彿鍒嗛殧")
+    private String ascStr;
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/request/TaskRequest.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/request/TaskRequest.java
new file mode 100644
index 0000000..8af48ea
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/request/TaskRequest.java
@@ -0,0 +1,13 @@
+package org.jeecg.modules.flow.request;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@NoArgsConstructor
+public class TaskRequest implements Serializable {
+    private String id;
+    private String businessKey;
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/IActivitiDefinitionService.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/IActivitiDefinitionService.java
new file mode 100644
index 0000000..b67624d
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/IActivitiDefinitionService.java
@@ -0,0 +1,60 @@
+package org.jeecg.modules.flow.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.modules.flow.entity.ActivitiDefinition;
+import org.jeecg.modules.flow.request.ActivitiDefinitionRequest;
+
+import java.util.List;
+
+public interface IActivitiDefinitionService extends IService<ActivitiDefinition> {
+    /**
+     * 娣诲姞閰嶇疆
+     * @param definition
+     * @return
+     */
+    boolean addDefinition(ActivitiDefinition definition);
+    /**
+     * 缂栬緫閰嶇疆
+     * @param definition
+     * @return
+     */
+    boolean editDefinition(String id, ActivitiDefinition definition);
+
+    /**
+     * 鍒犻櫎閰嶇疆
+     * @param id
+     * @return
+     */
+    boolean deleteDefinition(String id);
+
+    /**
+     * 鑾峰彇閮ㄩ棬鐨勬祦绋嬪畾涔�
+     * @param departId
+     * @return
+     */
+    ActivitiDefinition getByDepartId(String departId);
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param page
+     * @param size
+     * @param request
+     * @return
+     */
+    Result<?> findPageList(int page, int size, ActivitiDefinitionRequest request);
+
+    /**
+     * 鑾峰彇澶氫釜閮ㄩ棬鐨勫鎵逛汉 鍘婚噸
+     * @param departIds
+     * @return
+     */
+    List<String> getByDepartIds(List<String> departIds);
+
+    /**
+     * 鏍规嵁鐢ㄦ埛淇℃伅鑾峰彇瀹℃壒
+     * @param userId
+     * @return
+     */
+    List<ActivitiDefinition> findByUserId(String userId);
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/IActivitiSignExamineService.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/IActivitiSignExamineService.java
new file mode 100644
index 0000000..1ad8dc8
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/IActivitiSignExamineService.java
@@ -0,0 +1,9 @@
+package org.jeecg.modules.flow.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.flow.entity.ActivitiSignExamine;
+
+
+public interface IActivitiSignExamineService extends IService<ActivitiSignExamine> {
+
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/IAssignFileStreamService.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/IAssignFileStreamService.java
new file mode 100644
index 0000000..6b6e86f
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/IAssignFileStreamService.java
@@ -0,0 +1,95 @@
+package org.jeecg.modules.flow.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.modules.flow.entity.AssignFileStream;
+import org.jeecg.modules.flow.ext.AssignFileStreamExt;
+import org.jeecg.modules.flow.request.ApproveBatchRequest;
+import org.jeecg.modules.flow.request.AssignFileRequest;
+import org.jeecg.modules.flow.request.AssignFileStreamQueryRequest;
+import org.jeecg.modules.dnc.response.QueryPageResponseResult;
+import org.jeecg.modules.dnc.response.ResponseResult;
+
+public interface IAssignFileStreamService extends IService<AssignFileStream> {
+    /**
+     * 鍚姩娴佺▼ 淇濆瓨鐩稿簲鐨勬暟鎹� 缁戝畾businessKey
+     * @param stream
+     * @return
+     */
+    ResponseResult applyAssignFile(AssignFileStream stream);
+
+    /**securedoc
+     * 鍚姩娴佺▼ 淇濆瓨鐩稿簲鐨勬暟鎹� 缁戝畾businessKey
+     * @param stream
+     * @return
+     */
+    boolean applyAssignFileActive(AssignFileStream stream);
+    /**
+     * 鍚姩娴佺▼ 淇濆瓨鐩稿簲鐨勬暟鎹� 缁戝畾businessKey
+     * @param stream
+     * @return
+     */
+    ResponseResult applyAssignFileNonActive(AssignFileStream stream);
+
+
+    /**
+     * 鍏宠仈鐢ㄦ埛琛� 鑾峰彇鐢ㄦ埛鏄电О
+     * @param streamId
+     * @return
+     */
+    AssignFileStreamExt getAssignFileStreamDetail(String streamId);
+
+    /**
+     * 瀹℃壒鏈嶅姟
+     * @param taskId
+     * @param streamId
+     * @param stream
+     * @return
+     */
+    boolean approveAssignFile(String taskId, String streamId, AssignFileStream stream);
+
+    /**
+     * 鎵归噺鎸囨淳鍒拌澶�
+     * @param assignFileRequest
+     * @return
+     */
+    boolean applyBatchAssignFile(AssignFileRequest assignFileRequest);
+
+    /**
+     * 鎵归噺瀹℃壒
+     * @param approveBatchRequest
+     * @return
+     */
+    boolean approveBatchAssignFile(ApproveBatchRequest approveBatchRequest);
+
+    /**
+     * 宸插姙鍒楄〃鑾峰彇
+     * @param page
+     * @param size
+     * @return
+     */
+    Result<?> findPageList(int page, int size, AssignFileStreamQueryRequest request);
+
+    /**
+     * 鏌ヨ鏂囨。鐨勫鎵硅褰�
+     * @param page
+     * @param size
+     * @param docId
+     * @return
+     */
+    QueryPageResponseResult<AssignFileStreamExt> findPageListByDocId(int page, int size, String docId);
+
+    /**
+     * 鑾峰彇鍚敤娴佺▼鐨勬爣璁�
+     * @return
+     */
+    Boolean getFlowableEnable();
+
+    /**
+     * 鎵爜浼犺緭绋嬪簭 涓嶇粡杩囧鎵� 鏂囦欢瀛樺湪閲囩敤瑕嗙洊
+     * @param pnCode
+     * @param deviceNo
+     * @return
+     */
+    boolean transferDocFile(String pnCode, String deviceNo);
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/IToEquipmentTaskService.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/IToEquipmentTaskService.java
new file mode 100644
index 0000000..9f30e60
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/IToEquipmentTaskService.java
@@ -0,0 +1,7 @@
+package org.jeecg.modules.flow.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.flow.entity.ToEquipmentTask;
+
+public interface IToEquipmentTaskService extends IService<ToEquipmentTask> {
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/impl/ActivitiDefinitionServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/impl/ActivitiDefinitionServiceImpl.java
new file mode 100644
index 0000000..b6c5074
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/impl/ActivitiDefinitionServiceImpl.java
@@ -0,0 +1,150 @@
+package org.jeecg.modules.flow.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.modules.flow.service.IActivitiDefinitionService;
+import org.jeecg.modules.flow.entity.ActivitiDefinition;
+import org.jeecg.modules.flow.mapper.ActivitiDefinitionMapper;
+import org.jeecg.modules.flow.request.ActivitiDefinitionRequest;
+import org.jeecg.modules.dnc.exception.ExceptionCast;
+import org.jeecg.modules.dnc.mapper.DepartmentMapper;
+import org.jeecg.modules.dnc.response.ActivitiDefinitionCode;
+import org.jeecg.modules.dnc.response.CommonCode;
+import org.jeecg.modules.dnc.utils.ValidateUtil;
+import org.jeecg.modules.system.entity.MdcProduction;
+import org.jeecg.modules.system.entity.SysUser;
+import org.jeecg.modules.system.service.IMdcProductionService;
+import org.jeecg.modules.system.service.ISysUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+
+@Service
+public class ActivitiDefinitionServiceImpl extends ServiceImpl<ActivitiDefinitionMapper, ActivitiDefinition> implements IActivitiDefinitionService {
+    @Autowired
+    private DepartmentMapper departmentMapper;
+    @Autowired
+    private ISysUserService userService;
+    @Autowired
+    private IMdcProductionService iMdcProductionService;
+    @Override
+    @Transactional(rollbackFor = {Exception.class})
+    public boolean addDefinition(ActivitiDefinition definition) {
+        if(definition == null || !ValidateUtil.validateString(definition.getDepartId())
+        || !ValidateUtil.validateString(definition.getActName()) || !ValidateUtil.validateString(definition.getApproveUsers()))
+            ExceptionCast.cast(CommonCode.INVALID_PARAM);
+        ActivitiDefinition en = getByDepartId(definition.getDepartId());
+        if(en != null)
+            ExceptionCast.cast(ActivitiDefinitionCode.DEF_IS_EXIST);
+        //淇敼涓簃dc杞﹂棿
+        MdcProduction mdcProduction=iMdcProductionService.getById(definition.getDepartId());
+        if(mdcProduction == null)
+            ExceptionCast.cast(ActivitiDefinitionCode.DEF_DEPART_NONE);
+        String[] userIds = definition.getApproveUsers().split(",");
+        if(userIds == null|| userIds.length < 1)
+            ExceptionCast.cast(ActivitiDefinitionCode.DEF_USER_NONE);
+        List<String> userIdList = new ArrayList<>(userIds.length);
+        Collections.addAll(userIdList, userIds);
+        Collection<SysUser> userList = userService.listByIds(userIdList);
+        if(userList == null || userList.isEmpty() || userList.size() != userIds.length)
+            ExceptionCast.cast(ActivitiDefinitionCode.DEF_USER_NONE);
+        return super.save(definition);
+    }
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class})
+    public boolean editDefinition(String id, ActivitiDefinition definition) {
+        if(!ValidateUtil.validateString(id) || definition == null)
+            ExceptionCast.cast(CommonCode.INVALID_PARAM);
+        ActivitiDefinition en = super.getById(id);
+        if(en == null)
+            ExceptionCast.cast(ActivitiDefinitionCode.DEF_NOT_EXIST);
+        String[] userIds = definition.getApproveUsers().split(",");
+        if(userIds == null|| userIds.length < 1)
+            ExceptionCast.cast(ActivitiDefinitionCode.DEF_USER_NONE);
+        List<String> userIdList = new ArrayList<>(userIds.length);
+        Collections.addAll(userIdList, userIds);
+        Collection<SysUser> userList = userService.listByIds(userIdList);
+        if(userList == null || userList.isEmpty() || userList.size() != userIds.length)
+            ExceptionCast.cast(ActivitiDefinitionCode.DEF_USER_NONE);
+        definition.setId(id);
+        definition.setDepartId(null);
+        return super.updateById(definition);
+    }
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class})
+    public boolean deleteDefinition(String id) {
+        if(!ValidateUtil.validateString(id))
+            ExceptionCast.cast(CommonCode.INVALID_PARAM);
+        ActivitiDefinition en = super.getById(id);
+        if(en == null)
+            ExceptionCast.cast(ActivitiDefinitionCode.DEF_NOT_EXIST);
+        return super.removeById(id);
+    }
+
+    @Override
+    public ActivitiDefinition getByDepartId(String departId) {
+        if(!ValidateUtil.validateString(departId))
+            return null;
+        List<ActivitiDefinition> list = super.lambdaQuery().eq(ActivitiDefinition::getDepartId, departId).list();
+        if(list == null || list.isEmpty())
+            return null;
+        return list.get(0);
+    }
+
+    @Override
+    public Result<?> findPageList(int page, int size, ActivitiDefinitionRequest request) {
+        if(page < 1 || size < 1) {
+            ExceptionCast.cast(CommonCode.INVALID_PAGE);
+        }
+        IPage<ActivitiDefinition> pageData = new Page<>(page, size);
+        LambdaQueryChainWrapper<ActivitiDefinition> lambdaQuery = super.lambdaQuery();
+        if(request != null) {
+            if(ValidateUtil.validateString(request.getActName())) {
+                lambdaQuery.like(ActivitiDefinition::getActName, request.getActName());
+            }
+        }
+        lambdaQuery.orderByDesc(ActivitiDefinition::getCreateTime);
+        IPage<ActivitiDefinition> definitionIPage = lambdaQuery.page(pageData);
+        return Result.ok(definitionIPage);
+
+    }
+
+    @Override
+    public List<String> getByDepartIds(List<String> departIds) {
+        if(departIds == null || departIds.isEmpty())
+            return null;
+        List<ActivitiDefinition> list = super.lambdaQuery().in(ActivitiDefinition::getDepartId, departIds).list();
+        if(list == null || list.isEmpty())
+            return null;
+        Map<String, String> userIdMap = new HashMap<>();
+        list.forEach(item -> {
+            if(ValidateUtil.validateString(item.getApproveUsers())) {
+                String[] arr = item.getApproveUsers().split(",");
+                if(arr != null && arr.length > 0) {
+                    for (String s : arr) {
+                        userIdMap.put(s, s);
+                    }
+                }
+            }
+        });
+        if(userIdMap.isEmpty())
+            return null;
+        List<String> userIds = new ArrayList<>();
+        userIdMap.forEach((key, value) -> {
+            userIds.add(key);
+        });
+        return userIds;
+    }
+
+    @Override
+    public List<ActivitiDefinition> findByUserId(String userId) {
+        return super.lambdaQuery().like(ActivitiDefinition::getApproveUsers, userId).list();
+    }
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/impl/ActivitiSignExamineServiceimpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/impl/ActivitiSignExamineServiceimpl.java
new file mode 100644
index 0000000..a96f31a
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/impl/ActivitiSignExamineServiceimpl.java
@@ -0,0 +1,11 @@
+package org.jeecg.modules.flow.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.modules.flow.entity.ActivitiSignExamine;
+import org.jeecg.modules.flow.mapper.ActivitiSignExamineMapper;
+import org.jeecg.modules.flow.service.IActivitiSignExamineService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ActivitiSignExamineServiceimpl extends ServiceImpl<ActivitiSignExamineMapper, ActivitiSignExamine> implements IActivitiSignExamineService {
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/impl/AssignFileStreamServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/impl/AssignFileStreamServiceImpl.java
new file mode 100644
index 0000000..97159f1
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/impl/AssignFileStreamServiceImpl.java
@@ -0,0 +1,788 @@
+package org.jeecg.modules.flow.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.SecurityUtils;
+import org.flowable.engine.TaskService;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.flowable.task.api.Task;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.flow.entity.ToEquipmentTask;
+import org.jeecg.modules.flow.service.IActivitiDefinitionService;
+import org.jeecg.modules.flow.service.IAssignFileStreamService;
+import org.jeecg.modules.flow.service.IToEquipmentTaskService;
+import org.jeecg.modules.flow.entity.AssignFileStream;
+import org.jeecg.modules.flow.ext.AssignFileStreamExt;
+import org.jeecg.modules.flow.mapper.AssignFileStreamMapper;
+import org.jeecg.modules.flow.request.ApproveBatchRequest;
+import org.jeecg.modules.flow.request.AssignFileRequest;
+import org.jeecg.modules.flow.request.AssignFileStreamQueryRequest;
+import org.jeecg.modules.flow.request.TaskRequest;
+import org.jeecg.modules.dnc.entity.*;
+import org.jeecg.modules.dnc.exception.ExceptionCast;
+import org.jeecg.modules.dnc.ext.NcTxtFilePathInfo;
+import org.jeecg.modules.dnc.response.*;
+import org.jeecg.modules.dnc.service.*;
+import org.jeecg.modules.dnc.utils.ValidateUtil;
+import org.jeecg.modules.dnc.utils.date.DateUtil;
+import org.jeecg.modules.dnc.utils.file.FileUtilS;
+import org.jeecg.modules.flowable.apithird.service.FlowCommonService;
+import org.jeecg.modules.flowable.service.IFlowDefinitionService;
+import org.jeecg.modules.mdc.entity.MdcEquipment;
+import org.jeecg.modules.mdc.service.IMdcEquipmentService;
+import org.jeecg.modules.system.entity.MdcProduction;
+import org.jeecg.modules.system.service.IMdcProductionService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.io.IOException;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class AssignFileStreamServiceImpl extends ServiceImpl<AssignFileStreamMapper, AssignFileStream> implements IAssignFileStreamService {
+    private static final String PROCESS_KEY = "assign_nc_to_device";
+    private static final String APPLY_VARIABLE = "apply_user";
+    private static final String APPROVE_VARIABLE = "approve_users";
+    private static final String SEND_CODE = "SEND";
+
+    @Value("${flowable.enable}")
+    private Boolean flowableEnable;
+
+    @Autowired
+    private IDocInfoService docInfoService;
+    @Autowired
+    private IProcessStreamService processStreamService;
+    @Autowired
+    private IWorkStepService workStepService;
+    @Autowired
+    private IPermissionStreamService permissionStreamService;
+    @Autowired
+    private IDocClassificationService classificationService;
+    @Autowired
+    private IToEquipmentTaskService equipmentTaskService;
+    @Autowired
+    private IDeviceInfoService deviceInfoService;
+    @Autowired
+    private IDocFileService docFileService;
+    @Autowired
+    private IActivitiDefinitionService definitionService;
+    @Autowired
+    private IDocRelativeService docRelativeService;
+    @Autowired
+    private ISynchronizedFlagService synchronizedFlagService;
+    @Autowired
+    private IDeviceGroupService deviceGroupService;
+    @Autowired
+    private IDncPassLogService dncPassLogService;
+    @Autowired
+    private IDeviceCharactersService iDeviceCharactersService;
+    @Autowired
+    private IMdcEquipmentService iMdcEquipmentService;
+    @Autowired
+    private IMdcProductionService iMdcProductionService;
+    @Autowired
+    private StringRedisTemplate redisTemplate;
+    @Autowired
+    private TaskService taskService;
+    @Resource
+    private FlowCommonService flowCommonService;
+    @Resource
+    private IFlowDefinitionService flowDefinitionService;
+
+    @Value("${securedoc.serverIp}")
+    private String serverIp;
+    @Value("${securedoc.serverPort}")
+    private int serverPort;
+    @Value("${securedoc.whether}")
+    private String whether;
+    @Value("${securedoc.localFilePath}")
+    private String localFilePath;
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class})
+    public ResponseResult applyAssignFile(AssignFileStream stream) {
+        synchronized (this){
+            //鍒ゆ柇璁惧鐗规畩瀛楃
+            String specialChar = getDeviceSpecialChar(stream.getDeviceId(),stream.getFileId());
+            if (StrUtil.isNotEmpty(specialChar)){
+                //鎶涘嚭鐗规畩瀛楃寮傚父
+                return createSpecialCharErrorResponse(specialChar);
+            }
+            if(flowableEnable) {
+                boolean b = applyAssignFileActive(stream);
+                if (b) {
+                    return ResponseResult.SUCCESS();
+                } else {
+                    return ResponseResult.SUCCESS();
+                }
+
+            }else {
+                return applyAssignFileNonActive(stream);
+            }
+        }
+    }
+
+    /**
+     * 鍒ゆ柇璁惧鐗规畩瀛楃
+     * @param deviceId,fileId
+     * 璁惧ID锛屾枃浠禝D
+     */
+    public String getDeviceSpecialChar(String deviceId, String fileId){
+        //鏇挎崲涓簃dc璁惧琛�
+//        DeviceInfo deviceInfo = deviceInfoService.getById(deviceId);
+        MdcEquipment mdcEquipment = iMdcEquipmentService.getById(deviceId);
+        if(mdcEquipment == null)
+            ExceptionCast.cast(ActivitiCode.ACT_ASSIGN_DEVICE_NONE);
+//        DocFile docFile = docFileService.getById(fileId);
+        DocInfo docInfo = docInfoService.getOne(new QueryWrapper<DocInfo>().eq("publish_file_id",fileId));
+        if(docInfo == null)
+            ExceptionCast.cast(ActivitiCode.ACT_FILE_ERROR);
+        List<DeviceCharacters> deviceCharactersList=iDeviceCharactersService.list(
+                new LambdaQueryWrapper<DeviceCharacters>().eq(DeviceCharacters::getDeviceNo,mdcEquipment.getEquipmentId()));
+        if (deviceCharactersList.isEmpty()){
+            return "";
+        }else {
+            List<String> specialCharList=deviceCharactersList.stream().map(DeviceCharacters::getCharacters).collect(Collectors.toList());
+            if(!specialCharList.isEmpty()){
+                //瀵规瘮鏂囦欢鍚嶆槸鍚﹀寘鍚壒娈婂瓧绗�
+                String fileName=docInfo.getDocName();
+                for(String specialChar:specialCharList){
+                    if (fileName.contains(specialChar)){
+                        return specialChar;
+                    }
+                }
+            }else {
+                return "";
+            }
+        }
+        return "";
+    }
+
+    private ResponseResult createSpecialCharErrorResponse(String specialChar) {
+        return new ResponseResult(new ResultCode() {
+            @Override
+            public boolean success() {
+                return false;
+            }
+            @Override
+            public int code() {
+                return 88881;
+            }
+            @Override
+            public String message() {
+                return "鏂囦欢鍚嶇О瀛樺湪璁惧鐗规畩瀛楃" + specialChar;
+            }
+        });
+    }
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class})
+    public boolean applyAssignFileActive(AssignFileStream stream) {
+        validateParams(stream);
+        DocInfo docInfo = getDocInfo(stream);
+        MdcEquipment mdcEquipment = getMdcEquipment(stream);
+        DocFile docFile = docFileService.getById(stream.getFileId());
+        DocInfo deviceDoc = docInfoService.getByDocAttrAndDocId(stream.getDocId(), 4, stream.getDeviceId());
+        if (deviceDoc != null) {
+            handleExistingDeviceDoc(docFile, mdcEquipment, stream.getDeviceId());
+        }
+        deviceDoc = docInfoService.findByAttrAndDocName(docInfo.getDocName(), 4, stream.getDeviceId());
+        if (deviceDoc != null) {
+            handleExistingDeviceDoc(docFile, mdcEquipment, stream.getDeviceId());
+        }
+        List<PermissionStream> permissionStreams = getPermissionStreams(stream);
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String userId = user.getId();
+//        List<String> departIds = getDepartIds(permissionStreams, userId);
+//        List<String> userIdList = getUserIdList(departIds);
+//        saveBusinessObject(stream, userId);
+//        ProcessInstance processInstance = startProcessInstance(stream, userIdList);
+//        completeTask(processInstance, userId);
+        System.out.println("鎸囨淳NC鏂囨。鍒拌澶囨祦绋嬶細" + stream.getDocId());
+        flowCommonService.initActBusiness("鎸囨淳NC鏂囨。鍒拌澶囨祦绋嬶細" + stream.getStreamId(), stream.getStreamId(), "IAssignFileStreamService", "assign_nc_to_device", null);
+        Map<String, Object> variables = new HashMap<>();
+        variables.put("id", stream.getStreamId());
+        variables.put("approveContent", stream.getApproveContent());
+        flowDefinitionService.startProcessInstanceByKey("assign_nc_to_device", variables);
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class})
+    public ResponseResult applyAssignFileNonActive(AssignFileStream stream) {
+        //鏉冮檺鏍¢獙
+        validateParams(stream);
+        DocInfo docInfo = getDocInfo(stream);
+        MdcEquipment mdcEquipment = getMdcEquipment(stream);
+        DocFile docFile = getDocFile(stream);
+        DocInfo deviceDoc = docInfoService.getByDocAttrAndDocId(stream.getDocId(), 4, stream.getDeviceId());
+        if(deviceDoc != null) {
+            // 鍒犻櫎 澶囦唤  瑕嗙洊 鍘熸湁鐨�
+            List<String> strings=iMdcProductionService.findListParentTreeAll(mdcEquipment.getId());
+            if (strings != null && !strings.isEmpty()) {
+                String path = StringUtils.join(strings.toArray(), "/");
+                boolean copyFileNc = FileUtilS.copyFileNcToBak(path + "/"+ mdcEquipment.getEquipmentId(),
+                        docFile.getFileName(), docFile.getFileSuffix());
+            }
+        }
+        /*deviceDoc = docInfoService.findByAttrAndDocName(docInfo.getDocName(), 4, stream.getDeviceId());
+        if(deviceDoc != null) {
+            // 鍒犻櫎 澶囦唤  瑕嗙洊 鍘熸湁鐨�
+            List<String> strings =  deviceGroupService.findListParentTreeAll(deviceInfo.getGroupId());
+            if (strings != null && !strings.isEmpty()) {
+                String path = StringUtils.join(strings.toArray(), "/");
+                boolean copyFileNc = FileUtilS.copyFileNcToBak(path + "/"+ deviceInfo.getDeviceNo(),
+                        docFile.getFileName(), docFile.getFileSuffix());
+            }
+        }*/
+        getPermissionStreams(stream);
+        //鎻掑叆鏂囨。鍒拌澶囧彂閫佹枃妗�
+        if(deviceDoc == null) {
+            DocClassification classification = classificationService.getByCode(SEND_CODE);
+            if(classification == null)
+                ExceptionCast.cast(DocumentCode.DOC_CLASS_ERROR);
+            DocRelative docRelative = new DocRelative();
+            docRelative.setDocId(docInfo.getDocId());
+            docRelative.setClassificationId(classification.getClassificationId());
+            docRelative.setAttributionType(4);
+            docRelative.setAttributionId(stream.getDeviceId());
+            boolean b = docRelativeService.save(docRelative);
+            if(!b) {
+                ExceptionCast.cast(ActivitiCode.ACT_APPROVE_ERROR);
+            }
+
+        }
+        handleFileTransfer(mdcEquipment, docFile);
+        handleFileProcessing(docFile, mdcEquipment, whether, localFilePath);
+        synchronizedFlagService.updateFlag(2);
+        return new ResponseResult(CommonCode.SUCCESS);
+    }
+
+    @Override
+    public AssignFileStreamExt getAssignFileStreamDetail(String streamId) {
+        if(!ValidateUtil.validateString(streamId))
+            return null;
+        return super.getBaseMapper().getAssignFileStreamDetail(streamId);
+    }
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class})
+    public boolean approveAssignFile(String taskId, String streamId, AssignFileStream stream) {
+        if(!ValidateUtil.validateString(taskId) || !ValidateUtil.validateString(streamId) || stream == null)
+            ExceptionCast.cast(CommonCode.INVALID_PARAM);
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String userId = user.getId();
+        if(!ValidateUtil.validateString(userId))
+            ExceptionCast.cast(UcenterCode.UCENTER_ACCOUNT_NOT_EXIST);
+        if(!ValidateUtil.validateInteger(stream.getStatus()))
+            ExceptionCast.cast(ActivitiCode.ACT_STATUS_ERROR);
+        AssignFileStream en = super.getById(streamId);
+        if(en == null)
+            ExceptionCast.cast(ActivitiCode.ACT_BUSINESS_DETAIL_ERROR);
+        Task task = taskService.createTaskQuery().taskId(taskId).taskCandidateOrAssigned(userId).singleResult();
+        if(task == null)
+            ExceptionCast.cast(ActivitiCode.ACT_TASK_ERROR);
+        if(!ValidateUtil.validateString(task.getAssignee())) {
+            //鎷惧彇浠诲姟
+            taskService.claim(task.getId(), userId);
+            //瀹屾垚浠诲姟
+            taskService.complete(task.getId());
+        }else {
+            //瀹屾垚浠诲姟
+            taskService.complete(task.getId());
+        }
+        //鏇存柊瀵硅薄灏佽
+        AssignFileStream up = new AssignFileStream();
+        up.setApproveContent(stream.getApproveContent());
+        up.setStatus(stream.getStatus());
+        up.setApproveUserId(userId);
+        up.setApproveTime(DateUtil.getNow());
+        up.setStreamId(streamId);
+        boolean b = super.updateById(up);
+        if(!b)
+            ExceptionCast.cast(ActivitiCode.ACT_APPROVE_ERROR);
+        if(up.getStatus() == 2) {
+            //鍚屾剰鎿嶄綔
+            DocInfo docInfo = docInfoService.getByDocAttrAndDocId(en.getDocId(), 5, en.getProcessId());
+            if(docInfo == null || docInfo.getDocStatus() == 3)
+                ExceptionCast.cast(ActivitiCode.ACT_DOC_ERROR);
+            DeviceInfo deviceInfo = deviceInfoService.getById(en.getDeviceId());
+            if(deviceInfo == null)
+                ExceptionCast.cast(ActivitiCode.ACT_ASSIGN_DEVICE_NONE);
+            DocFile docFile = docFileService.getById(en.getFileId());
+            if(docFile == null)
+                ExceptionCast.cast(ActivitiCode.ACT_FILE_ERROR);
+            DocInfo deviceDoc = docInfoService.getByDocAttrAndDocId(en.getDocId(),4, en.getDeviceId());
+            if(deviceDoc != null) {
+                // 鍒犻櫎 澶囦唤  瑕嗙洊 鍘熸湁鐨�
+                List<String> strings =  deviceGroupService.findListParentTreeAll(deviceInfo.getGroupId());
+                if (strings != null && !strings.isEmpty()) {
+                    String path = StringUtils.join(strings.toArray(), "/");
+                    boolean copyFileNc = FileUtilS.copyFileNcToBak(path + "/"+ deviceInfo.getDeviceNo(),
+                            docFile.getFileName(), docFile.getFileSuffix());
+                  /*  //docInfoService.getBaseMapper().deleteById(deviceDoc.getDocId());
+                    boolean doc = docRelativeService.deleteCopyDocByAttrNext(deviceDoc.getDocId(),4,stream.getDeviceId());
+                    if (!doc) {
+                        ExceptionCast.cast(ActivitiCode.ACT_DOC_ERROR_DELEVE);
+                    }*/
+
+                }
+            } else {
+                //鎻掑叆鏂囨。鍒拌澶囧彂閫佹枃妗�
+                DocClassification classification = classificationService.getByCode(SEND_CODE);
+                if(classification == null)
+                    ExceptionCast.cast(DocumentCode.DOC_CLASS_ERROR);
+
+                DocRelative docRelative = new DocRelative();
+                docRelative.setDocId(docInfo.getDocId());
+                docRelative.setClassificationId(classification.getClassificationId());
+                docRelative.setAttributionType(4);
+                docRelative.setAttributionId(en.getDeviceId());
+                b = docRelativeService.save(docRelative);
+            }
+            if(!b)
+                ExceptionCast.cast(ActivitiCode.ACT_APPROVE_ERROR);
+            if (deviceInfo != null) {
+                List<String> strings =  deviceGroupService.findListParentTreeAll(deviceInfo.getGroupId());
+                if (strings != null && !strings.isEmpty()) {
+                    String path = StringUtils.join(strings.toArray(), "/");
+                    boolean copyFileNc = FileUtilS.copyFileNc(docFile.getFilePath(),path + "/"+ deviceInfo.getDeviceNo(),
+                            docFile.getFileEncodeName(),
+                            docFile.getFileName(),docFile.getFileSuffix());
+                    if (!copyFileNc) {
+                        ExceptionCast.cast(ActivitiCode.ACT_FILE_ERROR);
+                    } else {
+                        FileUtilS.deleteZipFromToSend(path + "/"+ deviceInfo.getDeviceNo(),
+                                docFile.getFileName(),docFile.getFileSuffix());
+
+                    }
+                }
+
+            }
+            return synchronizedFlagService.updateFlag(1);
+        }else if(up.getStatus() == 3) {
+            //鎷掔粷鎿嶄綔 浠�涔堜篃涓嶅仛
+            return true;
+        }else {
+            ExceptionCast.cast(ActivitiCode.ACT_APPROVE_ERROR);
+        }
+        return false;
+    }
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class})
+    public boolean applyBatchAssignFile(AssignFileRequest assignFileRequest) {
+        if(assignFileRequest == null)
+            ExceptionCast.cast(CommonCode.INVALID_PARAM);
+        String[] deviceIds = assignFileRequest.getDeviceIds();
+        if(deviceIds == null || deviceIds.length < 1)
+            ExceptionCast.cast(ActivitiCode.ACT_ASSIGN_DEVICE_NONE);
+        AssignFileStream stream;
+        for(String id : deviceIds) {
+            stream = new AssignFileStream();
+            stream.setProcessId(assignFileRequest.getProcessId());
+            stream.setDocId(assignFileRequest.getDocId());
+            stream.setFileId(assignFileRequest.getFileId());
+            stream.setApplyReason(assignFileRequest.getApplyReason());
+            stream.setDeviceId(id);
+            ResponseResult b = applyAssignFile(stream);
+            if(!b.isSuccess())
+                ExceptionCast.cast(ActivitiCode.ACT_APPLY_ERROR);
+        }
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class})
+    public boolean approveBatchAssignFile(ApproveBatchRequest approveBatchRequest) {
+        if(approveBatchRequest == null)
+            ExceptionCast.cast(CommonCode.INVALID_PARAM);
+        List<TaskRequest> list = approveBatchRequest.getTaskArr();
+        if(list == null || list.isEmpty())
+            ExceptionCast.cast(CommonCode.INVALID_PARAM);
+        list.forEach(item -> {
+            AssignFileStream stream = new AssignFileStream();
+            stream.setApproveContent(approveBatchRequest.getApproveContent());
+            stream.setStatus(approveBatchRequest.getStatus());
+            boolean b = approveAssignFile(item.getId(), item.getBusinessKey(), stream);
+            if(!b)
+                ExceptionCast.cast(ActivitiCode.ACT_APPROVE_ERROR);
+        });
+        return synchronizedFlagService.updateFlag(1);
+    }
+
+    @Override
+    public Result<?> findPageList(int page, int size, AssignFileStreamQueryRequest request) {
+        if(page < 1 || size < 1) {
+            ExceptionCast.cast(CommonCode.INVALID_PAGE);
+        }
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String userId = user.getId();
+        if(!ValidateUtil.validateString(userId))
+            ExceptionCast.cast(UcenterCode.UCENTER_ACCOUNT_NOT_EXIST);
+        LambdaQueryWrapper<AssignFileStreamExt> lambdaQueryWrapper = Wrappers.lambdaQuery();
+        lambdaQueryWrapper.eq(AssignFileStreamExt::getApproveUserId, userId);
+        lambdaQueryWrapper.orderByDesc(AssignFileStreamExt::getApproveTime);
+        IPage<AssignFileStreamExt> pageData = new Page<>(page, size);
+        if(request != null) {
+            if(ValidateUtil.validateString(request.getAscStr())) {
+                String[] ascArr = request.getAscStr().split(",");
+//                ((Page<AssignFileStreamExt>) pageData).setAsc(ascArr);
+            }
+            if(ValidateUtil.validateString(request.getDescStr())) {
+                String[] descStr = request.getDescStr().split(",");
+//                ((Page<AssignFileStreamExt>) pageData).setDesc(descStr);
+            }
+        }
+        IPage<AssignFileStreamExt> streamExtIPage = super.getBaseMapper().findByPage(pageData, lambdaQueryWrapper);
+        return Result.ok(streamExtIPage);
+    }
+
+    @Override
+    public QueryPageResponseResult<AssignFileStreamExt> findPageListByDocId(int page, int size, String docId) {
+        if(page < 1 || size < 1) {
+            ExceptionCast.cast(CommonCode.INVALID_PAGE);
+        }
+        if(!ValidateUtil.validateString(docId))
+            ExceptionCast.cast(ActivitiCode.ACT_DOC_ID_NONE);
+        QueryWrapper<AssignFileStreamExt> queryWrapper =  Wrappers.query();
+        queryWrapper.eq("a.doc_id", docId);
+        queryWrapper.orderByDesc("approve_time");
+        IPage<AssignFileStreamExt> pageData = new Page<>(page, size);
+        IPage<AssignFileStreamExt> streamExtIPage = super.getBaseMapper().findByPage(pageData, queryWrapper);
+        return new QueryPageResponseResult<>(CommonCode.SUCCESS, streamExtIPage);
+    }
+
+    @Override
+    public Boolean getFlowableEnable(){
+        if(flowableEnable != null) {
+            return flowableEnable;
+        }
+        return false;
+    }
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class})
+    public boolean transferDocFile(String pnCode, String deviceNo) {
+        List<ProcessStream> streams = processStreamService.validateDeviceProcessInfo(pnCode, deviceNo);
+        DeviceInfo deviceInfo = deviceInfoService.getByDeviceNo(deviceNo);
+        if(deviceInfo == null)
+            ExceptionCast.cast(DeviceCode.DEVICE_NOT_EXIST);
+        //鍒犻櫎鍘熸潵璁惧涓嬬殑鎵�鏈夋枃妗�
+        docRelativeService.deleteByDocAttr(4, deviceInfo.getDeviceId());
+        List<DocInfo> docInfoList = docInfoService.getByProcessIds(streams);
+        if(docInfoList == null || docInfoList.isEmpty())
+            ExceptionCast.cast(DocumentCode.DOC_NOT_EXIST);
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String userId = user.getId();
+        if(!ValidateUtil.validateString(userId))
+            ExceptionCast.cast(UcenterCode.UCENTER_ACCOUNT_NOT_EXIST);
+        for(DocInfo docInfo : docInfoList) {
+            DocFile docFile = docFileService.getById(docInfo.getPublishFileId());
+            if(docFile == null)
+                ExceptionCast.cast(ActivitiCode.ACT_FILE_ERROR);
+            //鎻掑叆鏂囨。鍒拌澶囧彂閫佹枃妗�
+            DocClassification classification = classificationService.getByCode(SEND_CODE);
+            if(classification == null)
+                ExceptionCast.cast(DocumentCode.DOC_CLASS_ERROR);
+            DocRelative docRelative = new DocRelative();
+            docRelative.setDocId(docInfo.getDocId());
+            docRelative.setClassificationId(classification.getClassificationId());
+            docRelative.setAttributionType(4);
+            docRelative.setAttributionId(deviceInfo.getDeviceId());
+            boolean b = docRelativeService.save(docRelative);
+            if(!b)
+                ExceptionCast.cast(ActivitiCode.ACT_APPROVE_ERROR);
+            //鎻掑叆鏂囦欢浼犺緭浠诲姟琛�
+            ToEquipmentTask equipmentTask = new ToEquipmentTask();
+            //涓嶈兘鐩存帴浠巇oc涓嬁fileId 鍜寁ersion  鍙兘浼氬瓨鍦ㄦ枌鏇�
+            //equipmentTask.setFileId(docInfo.getPublishFileId());
+            //equipmentTask.setDocVersion(docInfo.getPublishVersion());
+            equipmentTask.setDocId(docInfo.getDocId());
+            equipmentTask.setSyncFlag(1);
+            equipmentTask.setDeviceNo(deviceInfo.getDeviceNo());
+            equipmentTask.setDeviceId(deviceInfo.getDeviceId());
+            equipmentTask.setDepartId(deviceInfo.getDepartId());
+            //鏂囦欢鐩稿叧淇℃伅
+            equipmentTask.setFileId(docFile.getFileId());
+            equipmentTask.setDocVersion(docFile.getDocVersion());
+            equipmentTask.setFileName(docInfo.getDocName());
+            equipmentTask.setFileEncodeName(docFile.getFileEncodeName());
+            equipmentTask.setFilePath(docFile.getFilePath());
+            equipmentTask.setFileSuffix(docFile.getFileSuffix());
+            equipmentTask.setFileSize(docFile.getFileSize());
+            b = equipmentTaskService.save(equipmentTask);
+            if(!b) {
+                ExceptionCast.cast(ActivitiCode.ACT_APPROVE_ERROR);
+            }
+        }
+        return synchronizedFlagService.updateFlag(1);
+    }
+
+    //浼犲弬楠岃瘉
+    private void validateParams(AssignFileStream stream) {
+        if (stream == null) {
+            ExceptionCast.cast(CommonCode.INVALID_PARAM);
+        }
+        if (!ValidateUtil.validateString(stream.getAttributionId()) || !ValidateUtil.validateString(stream.getDocId())
+                || !ValidateUtil.validateString(stream.getFileId()) || !ValidateUtil.validateString(stream.getAttributionType())) {
+            ExceptionCast.cast(CommonCode.INVALID_PARAM);
+        }
+        if (!ValidateUtil.validateString(stream.getDeviceId())) {
+            ExceptionCast.cast(ActivitiCode.ACT_ASSIGN_DEVICE_NONE);
+        }
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String userId = user.getId();
+        if (!ValidateUtil.validateString(userId)) {
+            ExceptionCast.cast(UcenterCode.UCENTER_ACCOUNT_NOT_EXIST);
+        }
+    }
+
+    //鑾峰彇鏂囦欢淇℃伅
+    private DocInfo getDocInfo(AssignFileStream stream) {
+        DocInfo docInfo = docInfoService.getByDocAttrAndDocId(stream.getDocId(), Integer.parseInt(stream.getAttributionType()), stream.getAttributionId());
+        if (docInfo == null || docInfo.getDocStatus() == 3) {
+            ExceptionCast.cast(ActivitiCode.ACT_DOC_ERROR);
+        }
+        return docInfo;
+    }
+
+    //鑾峰彇鏂囦欢
+    private void handleExistingDeviceDoc(DocFile docFile, MdcEquipment mdcEquipment, String deviceId) {
+        List<String> strings = iMdcProductionService.findListParentTreeAll(mdcEquipment.getEquipmentId());
+        if (strings != null && !strings.isEmpty()) {
+            String path = StringUtils.join(strings.toArray(), "/");
+            boolean copyFileNc = FileUtilS.copyFileNcToBak(path + "/" + mdcEquipment.getEquipmentId(),
+                    docFile.getFileName(), docFile.getFileSuffix());
+            if (!copyFileNc) {
+                ExceptionCast.cast(ActivitiCode.ACT_FILE_ERROR);
+            } else {
+                DocInfo deviceDoc = docInfoService.getByDocAttrAndDocId(deviceId, 4, deviceId);
+                boolean doc = docRelativeService.deleteDocByAttr(deviceDoc.getDocId(), 4, deviceId);
+                if (!doc) {
+                    ExceptionCast.cast(ActivitiCode.ACT_DOC_ERROR_DELEVE);
+                }
+            }
+        }
+    }
+
+    //鏉冮檺鏍¢獙
+    private List<PermissionStream> getPermissionStreams(AssignFileStream stream) {
+        List<PermissionStream> permissionStreams = new ArrayList<>();
+        if (stream.getAttributionType().equals("5")) {
+            // 宸ュ簭
+            ProcessStream processStream = processStreamService.getById(stream.getAttributionId());
+            if (processStream == null) {
+                ExceptionCast.cast(CommonCode.INVALID_PARAM);
+            }
+            stream.setProductId(processStream.getProductId());
+            stream.setComponentId(processStream.getComponentId());
+            stream.setPartsId(processStream.getPartsId());
+            stream.setProcessId(processStream.getProcessId());
+            permissionStreams = permissionStreamService
+                    .getByProcessId(processStream.getProductId(), processStream.getComponentId(), processStream.getPartsId(), processStream.getProcessId());
+        } else {
+            // 宸ユ
+            WorkStep workStep = workStepService.getById(stream.getAttributionId());
+            if (workStep == null) {
+                ExceptionCast.cast(CommonCode.INVALID_PARAM);
+            }
+            stream.setProductId(workStep.getProductId());
+            stream.setComponentId(workStep.getComponentId());
+            stream.setPartsId(workStep.getPartsId());
+            stream.setProcessId(workStep.getProcessId());
+            stream.setStepId(workStep.getId());
+            permissionStreams = permissionStreamService
+                    .getByStepId(workStep.getProductId(), workStep.getComponentId(), workStep.getPartsId(), workStep.getProcessId(), workStep.getId());
+        }
+        if (permissionStreams == null || permissionStreams.isEmpty()) {
+            ExceptionCast.cast(ActivitiCode.ACT_NODE_DEPART_NONE);
+        }
+        return permissionStreams;
+    }
+
+    //鑾峰彇閮ㄩ棬淇℃伅
+    //todo 淇敼
+    private List<String> getDepartIds(List<PermissionStream> permissionStreams, String userId) {
+        Map<String, MdcProduction> map = iMdcProductionService.getUserAssignedDepart(userId);
+        List<String> departIds = permissionStreams.stream()
+                .filter(item -> map.containsKey(item.getDepartId()))
+                .map(PermissionStream::getDepartId)
+                .collect(Collectors.toList());
+        if (departIds.isEmpty()) {
+            ExceptionCast.cast(ActivitiCode.ACT_USER_NOT_PERM);
+        }
+        return departIds;
+    }
+
+    //鑾峰彇澶氫釜閮ㄩ棬鐨勫鎵逛汉 鍘婚噸
+    private List<String> getUserIdList(List<String> departIds) {
+        List<String> userIdList = definitionService.getByDepartIds(departIds);
+        if (userIdList == null || userIdList.isEmpty()) {
+            ExceptionCast.cast(ActivitiCode.ACT_APPROVE_USERS_NONE);
+        }
+        return userIdList;
+    }
+
+    //灏佽鏁版嵁
+    private void saveBusinessObject(AssignFileStream stream, String userId) {
+        String streamId = IdWorker.getIdStr();
+        stream.setStreamId(streamId);
+        stream.setApplyUserId(userId);
+        stream.setApplyTime(DateUtil.getNow());
+        stream.setStatus(1);
+        boolean b = super.save(stream);
+        if (!b) {
+            ExceptionCast.cast(ActivitiCode.ACT_BUSINESS_SAVE_ERROR);
+        }
+    }
+
+    //寮�濮嬪伐浣滄祦
+//    private ProcessInstance startProcessInstance(AssignFileStream stream, List<String> userIdList) {
+//        String approveUsers = String.join(",", userIdList);
+//        Map<String, Object> avariableMap = new HashMap<>();
+//        avariableMap.put(APPLY_VARIABLE, stream.getApplyUserId());
+//        avariableMap.put(APPROVE_VARIABLE, approveUsers);
+//        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(PROCESS_KEY, stream.getStreamId(), avariableMap);
+//        if (processInstance == null) {
+//            ExceptionCast.cast(ActivitiCode.ACT_APPROVE_USERS_NONE);
+//        }
+//        return processInstance;
+//    }
+
+    //鎷惧彇浠诲姟
+    private void completeTask(ProcessInstance processInstance, String userId) {
+        Task task = taskService.createTaskQuery().processDefinitionKey(PROCESS_KEY).taskAssignee(userId)
+                .processInstanceId(processInstance.getId()).singleResult();
+        if (task == null) {
+            ExceptionCast.cast(ActivitiCode.ACT_APPROVE_USERS_NONE);
+        }
+        taskService.complete(task.getId());
+    }
+
+    //鑾峰彇璁惧
+    private MdcEquipment getMdcEquipment(AssignFileStream stream) {
+        MdcEquipment mdcEquipment = iMdcEquipmentService.getById(stream.getDeviceId());
+        if (mdcEquipment == null) {
+            ExceptionCast.cast(ActivitiCode.ACT_ASSIGN_DEVICE_NONE);
+        }
+        return mdcEquipment;
+    }
+
+    //鑾峰彇鏂囦欢
+    private DocFile getDocFile(AssignFileStream stream) {
+        DocFile docFile = docFileService.getById(stream.getFileId());
+        if (docFile == null) {
+            ExceptionCast.cast(ActivitiCode.ACT_FILE_ERROR);
+        }
+        return docFile;
+    }
+
+    //鎻掑叆鏂囦欢浼犺緭浠诲姟琛�
+    private void handleFileTransfer(MdcEquipment mdcEquipment, DocFile docFile) {
+        List<String> strings = iMdcProductionService.findListParentTreeAll(mdcEquipment.getId());
+        if (strings != null && !strings.isEmpty()) {
+            String path = StringUtils.join(strings.toArray(), "/");
+            boolean copyFileNc = FileUtilS.copyFileNc(docFile.getFilePath(), path + "/" + mdcEquipment.getEquipmentId(),
+                    docFile.getFileEncodeName(),
+                    docFile.getFileName(), docFile.getFileSuffix());
+            if (!copyFileNc) {
+                ExceptionCast.cast(ActivitiCode.ACT_FILE_ERROR);
+            } else {
+                FileUtilS.deleteZipFromToSend(path + "/" + mdcEquipment.getEquipmentId(),
+                        docFile.getFileName(), docFile.getFileSuffix());
+            }
+        } else {
+            throw new RuntimeException("鏂囦欢浼犺緭璺緞鑾峰彇澶辫触");
+        }
+    }
+
+    //灏佽澶勭悊鏂囦欢
+    private void handleFileProcessing(DocFile docFile, MdcEquipment mdcEquipment, String whether, String localFilePath) {
+        if (whether.equals("true") && !docFile.getFileSuffix().equals("zip") && !docFile.getFileSuffix().equals("rar")) {
+            String size = FileUtilS.fileSizeNC(docFile.getFilePath(), docFile.getFileEncodeName());
+            List<String> strings = iMdcProductionService.findListParentTreeAll(mdcEquipment.getId());
+            if (strings != null && !strings.isEmpty()) {
+                String path = StringUtils.join(strings.toArray(), "/");
+                Date dateFirst = DateUtil.getNow();
+                DncPassLog passInfoTxt = new DncPassLog();
+                passInfoTxt.setDayTime(DateUtil.format(dateFirst, DateUtil.STR_YEARMONTHDAY));
+                DncPassLog dncPassLog = dncPassLogService.findDayTime(DateUtil.format(dateFirst, DateUtil.STR_YEARMONTHDAY));
+                Integer fileTxt = 0, fileNc = 0;
+                if (dncPassLog != null) {
+                    fileTxt = dncPassLog.getSequenceNumber() + 1;
+                    fileNc = fileTxt + 1;
+                } else {
+                    fileTxt = 1;
+                    fileNc = fileTxt + 1;
+                }
+                String sequence = String.format("%06d", fileTxt);
+                String sequenceNc = String.format("%06d", fileNc);
+                passInfoTxt.setSequenceNumber(fileTxt);
+                passInfoTxt.setSequenceOrder(sequence);
+                passInfoTxt.setCreateTime(dateFirst);
+                passInfoTxt.setPassType("02");
+                dncPassLogService.save(passInfoTxt);
+
+                DncPassLog passInfoNc = new DncPassLog();
+                passInfoNc.setSequenceNumber(fileNc);
+                passInfoNc.setSequenceOrder(sequenceNc);
+                passInfoNc.setDayTime(DateUtil.format(dateFirst, DateUtil.STR_YEARMONTHDAY));
+                passInfoNc.setPassType("02");
+                passInfoNc.setPassName(docFile.getFileName());
+                try {
+                    Thread.sleep(1000);
+                    Date date = new Date();
+                    passInfoNc.setCreateTime(date);
+                } catch (InterruptedException e) {
+                    Thread.currentThread().interrupt();
+                }
+                dncPassLogService.save(passInfoNc);
+
+                NcTxtFilePathInfo ncTxt = new NcTxtFilePathInfo();
+                ncTxt.setEquipmentId(mdcEquipment.getEquipmentId());
+                ncTxt.setFileNcName("02A" + DateUtil.format(dateFirst, DateUtil.STR_YEARMONTHDAY) + sequenceNc);
+                ncTxt.setFileTxtName("02A" + DateUtil.format(dateFirst, DateUtil.STR_YEARMONTHDAY) + sequence);
+                ncTxt.setFilePath(path + "/" + mdcEquipment.getEquipmentId() + "/");
+                ncTxt.setOrigFileName(docFile.getFileName());
+                ncTxt.setOrigFileSuffix(docFile.getFileSuffix());
+                ncTxt.setFileAddOrDelete(1);
+                String loFilePath = localFilePath + ncTxt.getFileTxtName() + ".nc";
+                try {
+                    String allList = ncTxt.getFileTxtName() + "\n"
+                            + ncTxt.getFileNcName() + "\n"
+                            + ncTxt.getOrigFileName() + "\n"
+                            + ncTxt.getOrigFileSuffix() + "\n"
+                            + ncTxt.getFilePath() + "\n"
+                            + ncTxt.getEquipmentId() + "\n"
+                            + ncTxt.getFileAddOrDelete().toString() + "\n"
+                            + size + "\n";
+                    FileUtilS.fileWriterSql(loFilePath, allList);
+                    boolean copyFileNc = FileUtilS.copyFileUpName(path + "/" + mdcEquipment.getEquipmentId() + "/send/" +
+                                    docFile.getFileName(),
+                            localFilePath + ncTxt.getFileNcName(),
+                            docFile.getFileSuffix(), "NC");
+                    if (!copyFileNc) {
+                        FileUtilS.deleteNcFile(loFilePath);
+                    }
+                } catch (IOException e) {
+                    throw new RuntimeException("鏂囦欢澶勭悊澶辫触", e);
+                }
+            }
+        }
+    }
+
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/impl/ToEquipmentTaskServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/impl/ToEquipmentTaskServiceImpl.java
new file mode 100644
index 0000000..13e0d2c
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/flow/service/impl/ToEquipmentTaskServiceImpl.java
@@ -0,0 +1,11 @@
+package org.jeecg.modules.flow.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.modules.flow.entity.ToEquipmentTask;
+import org.jeecg.modules.flow.service.IToEquipmentTaskService;
+import org.jeecg.modules.flow.mapper.ToEquipmentTaskMapper;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ToEquipmentTaskServiceImpl extends ServiceImpl<ToEquipmentTaskMapper, ToEquipmentTask> implements IToEquipmentTaskService {
+}
diff --git a/lxzn-module-flowable/pom.xml b/lxzn-module-flowable/pom.xml
index 51615bc..56d4169 100644
--- a/lxzn-module-flowable/pom.xml
+++ b/lxzn-module-flowable/pom.xml
@@ -22,7 +22,7 @@
             <groupId>org.flowable</groupId>
             <artifactId>flowable-engine</artifactId>
             <scope>compile</scope>
-            <version>6.4.0</version>
+            <version>6.5.0</version>
             <exclusions>
                 <exclusion>
                     <groupId>org.mybatis</groupId>
@@ -33,7 +33,7 @@
         <dependency>
             <groupId>org.flowable</groupId>
             <artifactId>flowable-spring-boot-starter-basic</artifactId>
-            <version>6.4.0</version>
+            <version>6.5.0</version>
         </dependency>
         <!--琛ㄨ揪寮忚В鏋愬伐鍏�-->
         <dependency>
@@ -47,6 +47,20 @@
             <artifactId>xercesImpl</artifactId>
             <version>2.12.0</version>
         </dependency>
+        <dependency>
+            <groupId>org.hibernate</groupId>
+            <artifactId>hibernate-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>provided</scope>
+        </dependency>
     </dependencies>
 
 </project>
diff --git a/lxzn-module-flowable/src/main/java/org/jeecg/JeecgFlowableCloudApplication.java b/lxzn-module-flowable/src/main/java/org/jeecg/JeecgFlowableCloudApplication.java
deleted file mode 100644
index 2dc8f42..0000000
--- a/lxzn-module-flowable/src/main/java/org/jeecg/JeecgFlowableCloudApplication.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.jeecg;//package org.jeecg;
-//
-//import org.springframework.boot.SpringApplication;
-//import org.springframework.boot.autoconfigure.SpringBootApplication;
-//import org.springframework.cloud.openfeign.EnableFeignClients;
-//
-//@SpringBootApplication
-//@EnableFeignClients
-//public class JeecgFlowableCloudApplication {
-//
-//    public static void main(String[] args) {
-//        SpringApplication.run(JeecgDemoCloudApplication.class, args);
-//    }
-//}
diff --git a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/service/FlowCommonService.java b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/service/FlowCommonService.java
index 3669e75..90af8d8 100644
--- a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/service/FlowCommonService.java
+++ b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/service/FlowCommonService.java
@@ -7,8 +7,9 @@
 import org.jeecg.modules.flowable.apithird.business.service.impl.FlowMyBusinessServiceImpl;
 import org.jeecg.modules.flowable.apithird.common.exception.CustomException;
 import org.jeecg.modules.flowable.service.impl.FlowInstanceServiceImpl;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
 
 /**
  *涓氬姟妯″潡璋冪敤API鐨勯泦鍚�
@@ -18,9 +19,9 @@
  */
 @Service
 public class FlowCommonService {
-    @Autowired
+    @Resource
     FlowMyBusinessServiceImpl flowMyBusinessService;
-    @Autowired
+    @Resource
     FlowInstanceServiceImpl flowInstanceService;
     /**
      * 鍒濆鐢熸垚鎴栦慨鏀逛笟鍔′笌娴佺▼鐨勫叧鑱斾俊鎭�<br/>
diff --git a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/config/FlowableConfig.java b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/config/FlowableConfig.java
new file mode 100644
index 0000000..c40dc09
--- /dev/null
+++ b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/config/FlowableConfig.java
@@ -0,0 +1,65 @@
+package org.jeecg.modules.flowable.config;
+import org.flowable.engine.ProcessEngine;
+import org.flowable.engine.ProcessEngineConfiguration;
+import org.flowable.engine.impl.cfg.StandaloneProcessEngineConfiguration;
+import org.flowable.eventregistry.impl.EventRegistryEngineConfiguration;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.DependsOn;
+import org.springframework.jdbc.datasource.DriverManagerDataSource;
+import org.flowable.eventregistry.impl.EventRegistryEngine;
+import javax.sql.DataSource;
+
+@Configuration
+public class FlowableConfig {
+
+    @Value("${spring.datasource.dynamic.datasource.master.url}")
+    private String jdbcUrl;
+    @Value("${spring.datasource.dynamic.datasource.master.username}")
+    private String jdbcUsername;
+    @Value("${spring.datasource.dynamic.datasource.master.password}")
+    private String jdbcPassword;
+    @Value("${spring.datasource.dynamic.datasource.master.driver-class-name}")
+    private String jdbcDriver;
+
+    @Bean
+    public DataSource dataSource() {
+        DriverManagerDataSource dataSource = new DriverManagerDataSource();
+        dataSource.setUrl(jdbcUrl);
+        dataSource.setUsername(jdbcUsername);
+        dataSource.setPassword(jdbcPassword);
+        dataSource.setDriverClassName(jdbcDriver);
+        return dataSource;
+    }
+
+    @Bean(name = "processEngine")
+    @DependsOn("dataSource")
+    public ProcessEngine createProcessEngine(DataSource dataSource) {
+        StandaloneProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration();
+        cfg.setDataSource(dataSource);
+        cfg.setDatabaseType("mssql");
+
+        // 鍙互鏍规嵁闇�瑕佹坊鍔犳洿澶氶厤缃�
+        cfg.setActivityFontName("瀹嬩綋");
+        cfg.setLabelFontName("瀹嬩綋");
+        cfg.setAnnotationFontName("瀹嬩綋");
+
+        // 璁剧疆鏁版嵁搴撴ā寮忔洿鏂扮瓥鐣ヤ负鑷姩鏇存柊
+        cfg.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
+
+        return cfg.buildProcessEngine();
+    }
+
+    @Bean(name = "eventRegistryEngine")
+    public EventRegistryEngine eventRegistryEngine(DataSource dataSource) {
+        EventRegistryEngineConfiguration config = new EventRegistryEngineConfiguration();
+        config.setDataSource(dataSource);
+        // 璁剧疆鏁版嵁搴撴ā寮忔洿鏂扮瓥鐣ワ紝杩欓噷閫夋嫨鑷姩鏇存柊
+        config.setDatabaseSchemaUpdate("true");
+        return config.buildEventRegistryEngine();
+    }
+}
+
+
+
diff --git a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/flow/FlowableConfig.java b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/flow/FlowableConfig.java
deleted file mode 100644
index 468cb9e..0000000
--- a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/flow/FlowableConfig.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.jeecg.modules.flowable.flow;
-
-import org.flowable.spring.SpringProcessEngineConfiguration;
-import org.flowable.spring.boot.EngineConfigurationConfigurer;
-import org.springframework.context.annotation.Configuration;
-
-
-/**
- */
-@Configuration
-public class FlowableConfig implements EngineConfigurationConfigurer<SpringProcessEngineConfiguration> {
-
-    @Override
-    public void configure(SpringProcessEngineConfiguration engineConfiguration) {
-        engineConfiguration.setActivityFontName("瀹嬩綋");
-        engineConfiguration.setLabelFontName("瀹嬩綋");
-        engineConfiguration.setAnnotationFontName("瀹嬩綋");
-
-    }
-}
-
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/MdcProductionMapper.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/MdcProductionMapper.java
index de6a479..60f15e2 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/MdcProductionMapper.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/MdcProductionMapper.java
@@ -41,4 +41,11 @@
      * @return
      */
     String findThreeProductionId(@Param("userId") String userId);
+
+    /**
+     * 鏍规嵁鐢ㄦ埛id鏌ヨ鐢ㄦ埛鍏ㄩ儴杞﹂棿鏉冮檺
+     * @param userId
+     * @return
+     */
+    List<MdcProduction> findAllProductionId(@Param("userId") String userId);
 }
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/MdcProductionMapper.xml b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/MdcProductionMapper.xml
index 119e935..f5228ba 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/MdcProductionMapper.xml
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/MdcProductionMapper.xml
@@ -31,4 +31,15 @@
     <select id="findThreeProductionId" resultType="java.lang.String">
         SELECT TOP 1 t2.id id FROM mdc_user_production t1 LEFT JOIN mdc_production t2 ON t1.pro_id = t2.id WHERE t1.user_id = #{userId} AND t2.org_type = '3'
     </select>
-</mapper>
\ No newline at end of file
+    <select id="findAllProductionId" resultType="org.jeecg.modules.system.entity.MdcProduction">
+        SELECT
+            t1.*
+        FROM
+            mdc_production t1
+                LEFT JOIN mdc_user_production t2 ON t1.id = t2.pro_id
+                LEFT JOIN sys_user t3 on t3.ID=t2.user_id
+        WHERE
+            t3.id = #{userId}
+          AND t1.org_type = '3'
+    </select>
+</mapper>
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IMdcProductionService.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IMdcProductionService.java
index 4f8f510..ca00c50 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IMdcProductionService.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IMdcProductionService.java
@@ -6,6 +6,7 @@
 import org.jeecg.modules.system.model.ProductionIdModel;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * @Description: 浜х嚎琛�
@@ -103,4 +104,11 @@
      * @return
      */
     List<String> findListParentTree(String parentId,List<String> stringList);
+
+    /**
+     * 鑾峰彇鐢ㄦ埛鎵�鍦ㄧ殑閮ㄩ棬
+     * @param userId
+     * @return
+     */
+    Map<String, MdcProduction> getUserAssignedDepart(String userId);
 }
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcProductionServiceImpl.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcProductionServiceImpl.java
index 9aca7fc..ceba76d 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcProductionServiceImpl.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcProductionServiceImpl.java
@@ -1,5 +1,6 @@
 package org.jeecg.modules.system.service.impl;
 
+import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -368,4 +369,23 @@
         }
         return stringList;
     }
+
+    /**
+     * 鑾峰彇鐢ㄦ埛宸插垎閰嶇殑閮ㄩ棬鍒楄〃
+     * @param userId
+     * @return
+     */
+     @Override
+     public Map<String, MdcProduction> getUserAssignedDepart(String userId){
+         if(StrUtil.isEmpty(userId))
+             return null;
+         List<MdcProduction> userPermDepart = this.baseMapper.findAllProductionId(userId);
+         if(userPermDepart == null || userPermDepart.isEmpty())
+             return null;
+         Map<String, MdcProduction> map = new HashMap<>();
+         userPermDepart.forEach(item -> {
+             map.put(item.getId(), item);
+         });
+         return map;
+    }
 }
diff --git a/lxzn-module-system/lxzn-system-start/src/main/java/org/jeecg/JeecgSystemApplication.java b/lxzn-module-system/lxzn-system-start/src/main/java/org/jeecg/JeecgSystemApplication.java
index fb33d25..b2edb45 100644
--- a/lxzn-module-system/lxzn-system-start/src/main/java/org/jeecg/JeecgSystemApplication.java
+++ b/lxzn-module-system/lxzn-system-start/src/main/java/org/jeecg/JeecgSystemApplication.java
@@ -1,6 +1,7 @@
 package org.jeecg;
 
 import lombok.extern.slf4j.Slf4j;
+import org.flowable.spring.boot.eventregistry.EventRegistryServicesAutoConfiguration;
 import org.jeecg.common.util.oConvertUtils;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration;
@@ -20,7 +21,7 @@
 */
 @Slf4j
 @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class,
-        ManagementWebSecurityAutoConfiguration.class})
+        ManagementWebSecurityAutoConfiguration.class, EventRegistryServicesAutoConfiguration.class})
 //@EnableAutoConfiguration(exclude={MongoAutoConfiguration.class})
 public class JeecgSystemApplication extends SpringBootServletInitializer {
 
diff --git a/lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml b/lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml
index da6655d..f94e1b9 100644
--- a/lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml
+++ b/lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml
@@ -151,6 +151,7 @@
 #    async-executor-activate: false
 #    async-executor-enabled: true
 flowable:
+  enable: true
   #鍏抽棴瀹氭椂浠诲姟JOB
   async-executor-activate: false
   database-schema-update: true
diff --git a/lxzn-module-system/lxzn-system-start/src/main/resources/application.yml b/lxzn-module-system/lxzn-system-start/src/main/resources/application.yml
index d52c03d..a543aab 100644
--- a/lxzn-module-system/lxzn-system-start/src/main/resources/application.yml
+++ b/lxzn-module-system/lxzn-system-start/src/main/resources/application.yml
@@ -3,4 +3,4 @@
     name: jeecg-system
   profiles:
     active: '@profile.name@'
-#    active: dev
\ No newline at end of file
+#    active: dev

--
Gitblit v1.9.3