diff --git a/src/main/java/cn/palmte/work/service/ActProcInsService.java b/src/main/java/cn/palmte/work/service/ActProcInsService.java
index b65bf49..78cd47d 100644
--- a/src/main/java/cn/palmte/work/service/ActProcInsService.java
+++ b/src/main/java/cn/palmte/work/service/ActProcInsService.java
@@ -9,6 +9,7 @@ import cn.palmte.work.utils.ActUtil;
 import cn.palmte.work.utils.InterfaceUtil;
 import org.activiti.bpmn.model.BpmnModel;
 import org.activiti.bpmn.model.FlowNode;
+import org.activiti.bpmn.model.Process;
 import org.activiti.bpmn.model.SequenceFlow;
 import org.activiti.engine.HistoryService;
 import org.activiti.engine.RepositoryService;
@@ -25,8 +26,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Propagation;
-import org.springframework.transaction.annotation.Transactional;
 import top.jfunc.common.db.QueryHelper;
 import top.jfunc.common.db.bean.Page;
 import top.jfunc.common.db.utils.Pagination;
@@ -35,6 +34,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
 
 
 @Service
@@ -163,49 +163,39 @@ public class ActProcInsService {
 
     public void createProcInsPng(HttpServletResponse response, String procInsId) throws IOException {
         try {
-            HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(procInsId).singleResult();            //获取历史流程实例
+            //获取历史流程实例
+            HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(procInsId).singleResult();
             //获取流程中已经执行的节点,按照执行先后顺序排序
             List<HistoricActivityInstance> hai = historyService.createHistoricActivityInstanceQuery().processInstanceId(procInsId).orderByHistoricActivityInstanceStartTime().asc().list();
-            // 历史流程节点中
-            List<HistoricActivityInstance> newHisActInstanceList = new ArrayList<HistoricActivityInstance>();
-            List<HistoricActivityInstance> newHisTaskInstanceList = new ArrayList<HistoricActivityInstance>();
-            if (hai != null && hai.size() > 0) {
-                for (int i = 0; i < hai.size(); i++) {
-                    HistoricActivityInstance historicActivityInstance = hai.get(i);
+            //开始和结束事件
+            List<HistoricActivityInstance> startEndEventList = new ArrayList<>();
+            List<HistoricActivityInstance> activityInstanceList = new ArrayList<>();
+
+            if (hai != null && !hai.isEmpty()) {
+                for (HistoricActivityInstance historicActivityInstance : hai) {
                     String activityType = historicActivityInstance.getActivityType();
+
                     if (activityType.equals("startEvent") || activityType.equals("endEvent")) {
-                        newHisActInstanceList.add(historicActivityInstance);
+                        startEndEventList.add(historicActivityInstance);
                     } else if (activityType.equals("serviceTask") || activityType.equals("userTask") || activityType.equals("exclusiveGateway") || activityType.equals("parallelGateway")) {
-                        if (newHisTaskInstanceList.size() > 0) {
-                            for (int j = 0; j < newHisTaskInstanceList.size(); j++) {
-                                HistoricActivityInstance historicTaskInstance = newHisTaskInstanceList.get(j);
-                                if (historicTaskInstance.getActivityId().equals(historicActivityInstance.getActivityId())) {  //如果列表中已包括
-                                    newHisTaskInstanceList.clear();
-                                    newHisTaskInstanceList.add(historicActivityInstance);
-                                    break;
-                                } else {
-                                    newHisTaskInstanceList.add(historicActivityInstance);
-                                    break;
-                                }
-                            }
-                        } else {
-                            newHisTaskInstanceList.add(historicActivityInstance);
+                        List<String> collect = activityInstanceList.stream().map(HistoricActivityInstance::getActivityId).collect(Collectors.toList());
+                        if (collect.contains(historicActivityInstance.getActivityId())) {
+                            //情况已经执行任务 处理驳回的情况
+                            activityInstanceList.clear();
                         }
+
+                        activityInstanceList.add(historicActivityInstance);
                     }
                 }
             }
-            for (int i = 0; i < newHisActInstanceList.size(); i++) {
-                HistoricActivityInstance historicActivityInstance = newHisActInstanceList.get(i);
-                newHisTaskInstanceList.add(historicActivityInstance);
-            }
 
-            List<String> executedActivityIdList = new ArrayList<String>();                        // 构造已执行的节点ID集合
-            for (HistoricActivityInstance activityInstance : newHisTaskInstanceList) {
-                executedActivityIdList.add(activityInstance.getActivityId());
-            }
+            activityInstanceList.addAll(startEndEventList);
+
             BpmnModel bpmnModel = repositoryService.getBpmnModel(historicProcessInstance.getProcessDefinitionId()); // 获取bpmnModel
-            List<String> flowIds = this.getExecutedFlows(bpmnModel, newHisTaskInstanceList);                        // 获取流程已发生流转的线ID集合
-            actUtil.responsePng(response, bpmnModel, executedActivityIdList, flowIds);
+            List<String> flowIds = this.getExecutedFlows(bpmnModel, activityInstanceList);                        // 获取流程已发生流转的线ID集合
+
+            List<String> idList = activityInstanceList.stream().map(HistoricActivityInstance::getActivityId).collect(Collectors.toList());
+            actUtil.responsePng(response, bpmnModel, idList, flowIds);
         } catch (Exception e) {
             logger.error("an exception happens in try catch statement", e);
         }
@@ -213,35 +203,31 @@ public class ActProcInsService {
     }
 
     public List<String> getExecutedFlows(BpmnModel bpmnModel, List<HistoricActivityInstance> historicActivityInstances) {
-        List<String> flowIdList = new ArrayList<String>();                    //流转线ID集合
+        List<String> flowIdList = new ArrayList<String>();            //流转线ID集合
         List<FlowNode> historicFlowNodeList = new LinkedList<FlowNode>();    //全部活动实例
         List<HistoricActivityInstance> finishedActivityInstanceList = new LinkedList<HistoricActivityInstance>();    //已完成的历史活动节点
         List list = new ArrayList();
 
+        Process mainProcess = bpmnModel.getMainProcess();
         for (HistoricActivityInstance historicActivityInstance : historicActivityInstances) {
-            historicFlowNodeList.add((FlowNode) bpmnModel.getMainProcess().getFlowElement(historicActivityInstance.getActivityId(), true));
+            FlowNode flowElement = (FlowNode) mainProcess.getFlowElement(historicActivityInstance.getActivityId(), true);
+            historicFlowNodeList.add(flowElement);
+
             if (historicActivityInstance.getEndTime() != null) {
                 finishedActivityInstanceList.add(historicActivityInstance);
             }
 
-        }
-        for (int x = 0; x < historicActivityInstances.size(); x++) {
-            HistoricActivityInstance historicActivityInstance = historicActivityInstances.get(x);
-            String activityType = historicActivityInstance.getActivityType();
             String activityId = historicActivityInstance.getActivityId();
-            if (!list.contains(activityId) && ("userTask".equals(activityType)
-                    || "serviceTask".equals(activityType)
-                    || "endEvent".equals(activityType)
-                    || "exclusiveGateway".equals(activityType)
-                    || "parallelGateway".equals(activityType))) {
+            if (!list.contains(activityId)) {
                 list.add(activityId);
             }
         }
+
         /**遍历已完成的活动实例,从每个实例的outgoingFlows中找到已执行的*/
         FlowNode currentFlowNode = null;
         for (HistoricActivityInstance currentActivityInstance : finishedActivityInstanceList) {
             /**获得当前活动对应的节点信息及outgoingFlows信息*/
-            currentFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(currentActivityInstance.getActivityId(), true);
+            currentFlowNode = (FlowNode) mainProcess.getFlowElement(currentActivityInstance.getActivityId(), true);
             List<SequenceFlow> sequenceFlowList = currentFlowNode.getOutgoingFlows();
             /**
              * 遍历outgoingFlows并找到已流转的
@@ -250,17 +236,15 @@ public class ActProcInsService {
              * 2.当前节点是以上两种类型之外的,通过outgoingFlows查找到的时间最近的流转节点视为有效流转
              */
             FlowNode targetFlowNode = null;
-            if ("parallelGateway".equals(currentActivityInstance.getActivityType())
-                    || "inclusiveGateway".equals(currentActivityInstance.getActivityType())) {
+            if ("parallelGateway".equals(currentActivityInstance.getActivityType()) || "inclusiveGateway".equals(currentActivityInstance.getActivityType())) {
                 for (SequenceFlow sequenceFlow : sequenceFlowList) { //遍历历史活动节点,找到匹配Flow目标节点的
-                    targetFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(sequenceFlow.getTargetRef(), true);
+                    targetFlowNode = (FlowNode) mainProcess.getFlowElement(sequenceFlow.getTargetRef(), true);
                     if (historicFlowNodeList.contains(targetFlowNode)) {
                         flowIdList.add(sequenceFlow.getId());
                     }
                 }
             } else {
                 List<Map<String, String>> tempMapList = new LinkedList<Map<String, String>>();
-//				for(SequenceFlow sequenceFlow : sequenceFlowList) {	 //遍历历史活动节点,找到匹配Flow目标节点的
                 for (int i = 0; i < sequenceFlowList.size(); i++) {  //遍历历史活动节点,找到匹配Flow目标节点的
                     SequenceFlow sequenceFlow = sequenceFlowList.get(i);
                     int taskSeq = list.indexOf(sequenceFlow.getSourceRef()); // 获取当前flow目标节点key在审批顺序
@@ -287,9 +271,9 @@ public class ActProcInsService {
                     flowId = map.get("flowId");
                     flowIdList.add(flowId);
                 }
-
             }
         }
+
         return flowIdList;
     }
 }
diff --git a/src/main/java/cn/palmte/work/utils/ActUtil.java b/src/main/java/cn/palmte/work/utils/ActUtil.java
index 341aa57..b54b9cc 100644
--- a/src/main/java/cn/palmte/work/utils/ActUtil.java
+++ b/src/main/java/cn/palmte/work/utils/ActUtil.java
@@ -29,6 +29,7 @@ import top.jfunc.common.utils.IoUtil;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.Method;
@@ -180,7 +181,9 @@ public class ActUtil {
      */
     public void responseXml(HttpServletResponse response, String deploymentId) throws IOException {
         try (InputStream inputStream = getXmlStreamByDeploymentId(deploymentId)) {
+            IoUtil.copy(new ByteArrayInputStream("<xmp>".getBytes()), response.getOutputStream());
             IoUtil.copy(inputStream, response.getOutputStream());
+            IoUtil.copy(new ByteArrayInputStream("</xmp>".getBytes()), response.getOutputStream());
         }
     }
 
@@ -268,13 +271,8 @@ public class ActUtil {
      * @throws IOException
      */
     private InputStream getXmlStreamByDeploymentId(String deploymentId) throws IOException {
-        List<String> names = repositoryService.getDeploymentResourceNames(deploymentId);
-        for (String name : names) {
-            if (name.contains("xml")) {
-                return repositoryService.getResourceAsStream(deploymentId, name);
-            }
-        }
-        return null;
+        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deploymentId).singleResult();
+        return repositoryService.getResourceAsStream(deploymentId, processDefinition.getResourceName());
     }
 
 
diff --git a/src/main/resources/templates/admin/act_proc_def_list.ftl b/src/main/resources/templates/admin/act_proc_def_list.ftl
index ff15939..38a084b 100644
--- a/src/main/resources/templates/admin/act_proc_def_list.ftl
+++ b/src/main/resources/templates/admin/act_proc_def_list.ftl
@@ -86,10 +86,11 @@
 
                                     <button type="button"
                                             class="am-btn am-btn-default am-btn-xs am-text-secondary"
-                                            onclick="window.open('${base}/actProcDef/xml/${list.deploymentId!}')">
+                                            onclick="xmlView('${list.deploymentId!}')">
                                         <span class="am-icon-pencil-square-o"></span>
                                         流程xml
                                     </button>
+
                                 </td>
                                 <td>
                                     <div class="switch-button">
@@ -280,4 +281,15 @@
         });
     };
 
+    var xmlView = function (id) {
+        layer.open({
+            type: 2,
+            title: '',
+            shadeClose: true,
+            shade: 0.8,
+            area: ['90%', '90%'],
+            content: '${base}/actProcDef/xml/' + id,
+        });
+    };
+
 </script>
\ No newline at end of file