Browse Source

质量问题审核流程修改

wangliang 1 year ago
parent
commit
1479b3cef9

+ 55 - 28
sop-business/src/main/java/com/qmth/sop/business/activiti/listener/ProcessEventListener.java

@@ -1,7 +1,9 @@
 package com.qmth.sop.business.activiti.listener;
 
 import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qmth.sop.business.bean.dto.FlowRejectSequenceDto;
 import com.qmth.sop.business.bean.result.FlowFormWidgetResult;
 import com.qmth.sop.business.bean.result.FlowResult;
 import com.qmth.sop.business.bean.result.FlowTablePropResult;
@@ -99,11 +101,12 @@ public class ProcessEventListener implements ActivitiEventListener, Serializable
             Iterator iterator = rootElement.elementIterator();
             LinkedHashMap<String, FlowTaskResult> setupMap = new LinkedHashMap<>();//流程审批步骤map
             TFCustomTypeEnum customTypeEnum = null;
+            Map<String, List<FlowRejectSequenceDto>> approveRejectMap = null;
             while (iterator.hasNext()) {
                 Element element = (Element) iterator.next();
                 List<Attribute> attributes = element.attributes();
                 for (Attribute attr : attributes) {
-//                    log.info("属性:{},---值:{}", attr.getName(), attr.getValue());
+                    log.info("属性:{},---值:{}", attr.getName(), attr.getValue());
                     if (Objects.equals(attr.getName(), SystemConstant.ID) &&
                             (Objects.equals(attr.getValue(), TFCustomTypeEnum.OFFICE_SOP_FLOW.name())
                                     || Objects.equals(attr.getValue(), TFCustomTypeEnum.CLOUD_MARK_SOP_FLOW.name())
@@ -119,36 +122,51 @@ public class ProcessEventListener implements ActivitiEventListener, Serializable
                     FlowTaskResult flowTaskResult = new FlowTaskResult();
                     Element node = (Element) itt.next();
                     attributes = node.attributes();
-//                    log.info("节点:{},---值:{}", node.getName(), node.getStringValue());
-                    if (Objects.equals(node.getName(), SystemConstant.USER_TASK) || Objects.equals(node.getName(), SystemConstant.END_EVENT)) {
+                    log.info("节点:{},---值:{}", node.getName(), node.getStringValue());
+                    if (Objects.equals(node.getName(), SystemConstant.USER_TASK) || Objects.equals(node.getName(), SystemConstant.START_EVENT) || Objects.equals(node.getName(), SystemConstant.END_EVENT)) {
                         for (Attribute attr : attributes) {
-//                            log.info("节点属性:{},---节点值:{}", attr.getName(), attr.getValue());
-                            if (Objects.equals(attr.getName(), SystemConstant.ID)) {
-                                flowTaskResult.setTaskKey(attr.getValue());
-                                flowTaskResult.setSetup(Integer.valueOf(attr.getValue().substring(attr.getValue().length() - 1, attr.getValue().length())));
-                                setupMap.put(attr.getValue(), flowTaskResult);
-                            } else if (Objects.equals(attr.getName(), SystemConstant.NAME)) {
-                                flowTaskResult.setTaskName(attr.getValue());
-                            }
-//                                            else if (Objects.equals(attr.getName(), SystemConstant.ASSIGNEE_USER)) {
-//                                                flowTaskResult.setFlowTaskVar(attr.getValue().replaceAll("\\$\\{", "").replaceAll("\\}", ""));
-//                                            }
-                            else if (Objects.equals(attr.getName(), SystemConstant.FORM_KEY) && SystemConstant.FLOW_MAP.containsKey(resourceEntity.getDeploymentId() + SystemConstant.FLOW_FORM_ID_SPACE + attr.getValue())) {
-                                flowTaskResult.setFormKey(attr.getValue());
+                            log.info("节点属性:{},---节点值:{}", attr.getName(), attr.getValue());
+                            if (Objects.equals(node.getName(), SystemConstant.USER_TASK) || Objects.equals(node.getName(), SystemConstant.END_EVENT)) {
+                                if (Objects.equals(attr.getName(), SystemConstant.ID)) {
+                                    flowTaskResult.setTaskKey(attr.getValue());
+                                    flowTaskResult.setSetup(Integer.valueOf(attr.getValue().substring(attr.getValue().length() - 1, attr.getValue().length())));
+                                    setupMap.put(attr.getValue(), flowTaskResult);
+                                } else if (Objects.equals(attr.getName(), SystemConstant.NAME)) {
+                                    flowTaskResult.setTaskName(attr.getValue());
+                                } else if (Objects.equals(attr.getName(), SystemConstant.FORM_KEY) && SystemConstant.FLOW_MAP.containsKey(resourceEntity.getDeploymentId() + SystemConstant.FLOW_FORM_ID_SPACE + attr.getValue())) {
+                                    if (Objects.equals(node.getName(), SystemConstant.USER_TASK) || Objects.equals(node.getName(), SystemConstant.END_EVENT)) {
+                                        flowTaskResult.setFormKey(attr.getValue());
+                                        List<String> list = SystemConstant.FLOW_MAP.get(resourceEntity.getDeploymentId() + SystemConstant.FLOW_FORM_ID_SPACE + attr.getValue());
+                                        String data = list.get(list.size() - 1);
+                                        List<FlowFormWidgetResult> listData = JSONArray.parseArray(data, FlowFormWidgetResult.class);
+                                        for (FlowFormWidgetResult f : listData) {
+                                            f.setFormId(flowTaskResult.getTaskKey() + SystemConstant.FLOW_FORM_ID_SPACE + f.getFormId());
+                                            f.setFormName(flowTaskResult.getTaskKey() + SystemConstant.FLOW_FORM_ID_SPACE + f.getFormName());
+                                            if (!CollectionUtils.isEmpty(f.getTablePropList())) {
+                                                for (FlowTablePropResult t : f.getTablePropList()) {
+                                                    t.setTdId(flowTaskResult.getTaskKey() + SystemConstant.FLOW_FORM_ID_SPACE + t.getWidgetId() + SystemConstant.FLOW_FORM_ID_SPACE + t.getTdId());
+                                                    t.setTdName(flowTaskResult.getTaskKey() + SystemConstant.FLOW_FORM_ID_SPACE + t.getWidgetId() + SystemConstant.FLOW_FORM_ID_SPACE + t.getTdName());
+                                                }
+                                            }
+                                        }
+                                        flowTaskResult.setFormProperty(listData);
+                                    }
+                                }
+                            } else {
                                 List<String> list = SystemConstant.FLOW_MAP.get(resourceEntity.getDeploymentId() + SystemConstant.FLOW_FORM_ID_SPACE + attr.getValue());
-                                String data = list.get(list.size() - 1);
-                                List<FlowFormWidgetResult> listData = JSONArray.parseArray(data, FlowFormWidgetResult.class);
-                                for (FlowFormWidgetResult f : listData) {
-                                    f.setFormId(flowTaskResult.getTaskKey() + SystemConstant.FLOW_FORM_ID_SPACE + f.getFormId());
-                                    f.setFormName(flowTaskResult.getTaskKey() + SystemConstant.FLOW_FORM_ID_SPACE + f.getFormName());
-                                    if (!CollectionUtils.isEmpty(f.getTablePropList())) {
-                                        for (FlowTablePropResult t : f.getTablePropList()) {
-                                            t.setTdId(flowTaskResult.getTaskKey() + SystemConstant.FLOW_FORM_ID_SPACE + t.getWidgetId() + SystemConstant.FLOW_FORM_ID_SPACE + t.getTdId());
-                                            t.setTdName(flowTaskResult.getTaskKey() + SystemConstant.FLOW_FORM_ID_SPACE + t.getWidgetId() + SystemConstant.FLOW_FORM_ID_SPACE + t.getTdName());
+                                if (!CollectionUtils.isEmpty(list)) {
+                                    String data = list.get(list.size() - 1);
+                                    if (Objects.nonNull(data)) {
+                                        JSONObject jsonObject = JSONObject.parseObject(data);
+                                        if (Objects.nonNull(jsonObject.getJSONObject(SystemConstant.ARRROVE_REJECT_MAP))) {
+                                            JSONObject object = jsonObject.getJSONObject(SystemConstant.ARRROVE_REJECT_MAP);
+                                            approveRejectMap = new LinkedHashMap<>(object.size());
+                                            for (Map.Entry<String, Object> entry : object.entrySet()) {
+                                                approveRejectMap.put(entry.getKey(), (List<FlowRejectSequenceDto>) entry.getValue());
+                                            }
                                         }
                                     }
                                 }
-                                flowTaskResult.setFormProperty(listData);
                             }
                         }
                     }
@@ -173,10 +191,16 @@ public class ProcessEventListener implements ActivitiEventListener, Serializable
             Map.Entry<String, FlowTaskResult> tmpEntry = null;
             while (iter.hasNext()) {
                 tmpEntry = iter.next();
-                setupMap.put(tmpEntry.getKey(), tmpEntry.getValue());
+                FlowTaskResult flowTaskResult = tmpEntry.getValue();
+                if (!CollectionUtils.isEmpty(approveRejectMap)) {
+                    if (approveRejectMap.containsKey(tmpEntry.getKey())) {
+                        flowTaskResult.setApproveRejectList(approveRejectMap.get(tmpEntry.getKey()));
+                    }
+                }
+                setupMap.put(tmpEntry.getKey(), flowTaskResult);
             }
             FlowResult flowResult = new FlowResult(resourceEntity.getDeploymentId(), resourceEntity.getName(), setupMap);
-//            log.info("flowResult:{}", JacksonUtil.parseJson(flowResult));
+            log.info("flowResult:{}", JacksonUtil.parseJson(flowResult));
             TFCustomFlowService tfCustomFlowService = SpringContextHolder.getBean(TFCustomFlowService.class);
             TFCustomFlow tfCustomFlow = tfCustomFlowService.getOne(new QueryWrapper<TFCustomFlow>().lambda().eq(TFCustomFlow::getFlowDeploymentId, flowResult.getFlowDeploymentId()));
             if (Objects.isNull(tfCustomFlow)) {
@@ -194,6 +218,9 @@ public class ProcessEventListener implements ActivitiEventListener, Serializable
                 flowResult.setVersion(tfCustomFlow.getVersion());
                 tfCustomFlow.setUpdateTime(System.currentTimeMillis());
             }
+//            if (!CollectionUtils.isEmpty(approveRejectMap)) {
+//                flowResult.setApproveRejectMap(approveRejectMap);
+//            }
             tfCustomFlow.setFlowProcessVar(JacksonUtil.parseJson(flowResult));
             tfCustomFlowService.saveOrUpdate(tfCustomFlow);
         } catch (DocumentException e) {

+ 8 - 10
sop-business/src/main/java/com/qmth/sop/business/activiti/service/impl/ActivitiServiceImpl.java

@@ -4,7 +4,6 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
 import com.qmth.boot.api.exception.ApiException;
 import com.qmth.sop.business.activiti.service.ActivitiService;
@@ -179,8 +178,10 @@ public class ActivitiServiceImpl implements ActivitiService {
                                            String approveRemark,
                                            Map<String, Object> map) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-        if (CollectionUtils.isEmpty(approveUserIds) && (approve == FlowApprovePassEnum.START || approve == FlowApprovePassEnum.DRAFT || approve == FlowApprovePassEnum.PASS)) {
-            approveUserIds = new ArrayList<>();
+        approveUserIds = new ArrayList<>();
+        if (approve == FlowApprovePassEnum.START || approve == FlowApprovePassEnum.DRAFT) {//第一步只能是当前用户
+            approveUserIds.add(String.valueOf(sysUser.getId()));//否则是当前登录用户
+        } else if (CollectionUtils.isEmpty(approveUserIds) && approve == FlowApprovePassEnum.PASS) {
             approveUserIds.add(String.valueOf(sysUser.getId()));//否则是当前登录用户
         }
         String processFlowId = null;
@@ -439,10 +440,8 @@ public class ActivitiServiceImpl implements ActivitiService {
                     for (Task t : taskList) {
                         FlowResult flowResult = JSONObject.parseObject(w.getFlowProcessVar(), FlowResult.class);
                         LinkedHashMap<String, FlowTaskResult> setupMap = flowResult.getSetupMap();
-                        for (Task task : taskList) {
-                            FlowTaskResult currFlowTaskResult = GsonUtil.fromJson(GsonUtil.toJson(setupMap.get(task.getTaskDefinitionKey())), FlowTaskResult.class);
-                            map = this.getFlowFormPropertie(flowResult, map, currFlowTaskResult.getSetup());
-                        }
+                        FlowTaskResult currFlowTaskResult = GsonUtil.fromJson(GsonUtil.toJson(setupMap.get(t.getTaskDefinitionKey())), FlowTaskResult.class);
+                        map = this.getFlowFormPropertie(flowResult, map, currFlowTaskResult.getSetup());
                         formPropertyList.add(new FormPropertyBean(Long.parseLong(t.getProcessInstanceId()), Long.parseLong(t.getId()), userId, (FlowTaskResult) map.get(SystemConstant.FORM_PROPERTIES), w.getStatus(), String.valueOf(w.getCustomFlowEntityid())));
                     }
                 }
@@ -604,7 +603,6 @@ public class ActivitiServiceImpl implements ActivitiService {
         FlowResult flowResult = JSONObject.parseObject(tfCustomFlowEntity.getFlowProcessVar(), FlowResult.class);
         LinkedHashMap<String, FlowTaskResult> setupMap = flowResult.getSetupMap();
 
-        Gson gson = new Gson();
         FlowTaskResult currFlowTaskResult = null;
         List<FlowTaskResult> flowTaskHistoryList = null;
         List<Long> taskIdList = null;
@@ -614,7 +612,7 @@ public class ActivitiServiceImpl implements ActivitiService {
         //获取流程审批历史
         List<TFFlowLogResult> tfFlowLogResultList = tfFlowLogService.findByObjectId(tfCustomFlowEntity.getId());
         if (!CollectionUtils.isEmpty(tfFlowLogResultList)) {
-            flowApproveHistoryList = gson.fromJson(gson.toJson(tfFlowLogResultList), new TypeToken<List<TFFlowViewLogResult>>() {
+            flowApproveHistoryList = GsonUtil.fromJson(GsonUtil.toJson(tfFlowLogResultList), new TypeToken<List<TFFlowViewLogResult>>() {
             }.getType());
             for (TFFlowViewLogResult t : flowApproveHistoryList) {
                 t.setMessageType(FlowMsgTypeEnum.STANDARD);
@@ -622,7 +620,7 @@ public class ActivitiServiceImpl implements ActivitiService {
             }
         }
         for (Map.Entry<String, FlowTaskResult> entry : setupMap.entrySet()) {
-            FlowTaskResult flowTaskResult = gson.fromJson(gson.toJson(entry.getValue()), FlowTaskResult.class);
+            FlowTaskResult flowTaskResult = GsonUtil.fromJson(GsonUtil.toJson(entry.getValue()), FlowTaskResult.class);
             if (flowTaskResult.getSetup() > 0) {
                 //正在审批的表单
                 if (Objects.nonNull(tfFlowApprove.getSetup()) && flowTaskResult.getSetup().intValue() == tfFlowApprove.getSetup().intValue()) {

+ 8 - 8
sop-business/src/main/java/com/qmth/sop/business/bean/bean/FormPropertyBean.java

@@ -30,8 +30,8 @@ public class FormPropertyBean implements Serializable {
     @ApiModelProperty(value = "流程状态")
     String statusStr;
 
-    @ApiModelProperty(value = "sopid")
-    String sopId;
+    @ApiModelProperty(value = "sop单号")
+    String sopNo;
 
     @ApiModelProperty(value = "流程任务id")
     @JsonSerialize(using = ToStringSerializer.class)
@@ -54,13 +54,13 @@ public class FormPropertyBean implements Serializable {
         this.setupMap = setupMap;
     }
 
-    public FormPropertyBean(Long flowId, Long taskId, Long userId, FlowTaskResult setupMap, FlowStatusEnum status, String sopId) {
+    public FormPropertyBean(Long flowId, Long taskId, Long userId, FlowTaskResult setupMap, FlowStatusEnum status, String sopNo) {
         this.flowId = flowId;
         this.taskId = taskId;
         this.userId = userId;
         this.setupMap = setupMap;
         this.status = status;
-        this.sopId = sopId;
+        this.sopNo = sopNo;
     }
 
     public String getStatusStr() {
@@ -83,12 +83,12 @@ public class FormPropertyBean implements Serializable {
         this.status = status;
     }
 
-    public String getSopId() {
-        return sopId;
+    public String getSopNo() {
+        return sopNo;
     }
 
-    public void setSopId(String sopId) {
-        this.sopId = sopId;
+    public void setSopNo(String sopNo) {
+        this.sopNo = sopNo;
     }
 
     public Long getFlowId() {

+ 48 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/dto/FlowRejectSequenceDto.java

@@ -0,0 +1,48 @@
+package com.qmth.sop.business.bean.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 流程驳回走向 dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/2/10
+ */
+public class FlowRejectSequenceDto implements Serializable {
+
+    @ApiModelProperty(value = "后置流程节点key")
+    String afterFlowTaskKey;
+
+    @ApiModelProperty(value = "前置流程节点key")
+    String beforeFlowTaskKey;
+
+    @ApiModelProperty(value = "流程步骤")
+    Integer setup;
+
+    public String getAfterFlowTaskKey() {
+        return afterFlowTaskKey;
+    }
+
+    public void setAfterFlowTaskKey(String afterFlowTaskKey) {
+        this.afterFlowTaskKey = afterFlowTaskKey;
+    }
+
+    public String getBeforeFlowTaskKey() {
+        return beforeFlowTaskKey;
+    }
+
+    public void setBeforeFlowTaskKey(String beforeFlowTaskKey) {
+        this.beforeFlowTaskKey = beforeFlowTaskKey;
+    }
+
+    public Integer getSetup() {
+        return setup;
+    }
+
+    public void setSetup(Integer setup) {
+        this.setup = setup;
+    }
+}

+ 12 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/result/FlowTaskResult.java

@@ -1,5 +1,6 @@
 package com.qmth.sop.business.bean.result;
 
+import com.qmth.sop.business.bean.dto.FlowRejectSequenceDto;
 import io.swagger.annotations.ApiModelProperty;
 import org.jetbrains.annotations.NotNull;
 
@@ -30,6 +31,17 @@ public class FlowTaskResult implements Serializable, Comparable<FlowTaskResult>
     @ApiModelProperty(value = "表单数据")
     private List<FlowFormWidgetResult> formProperty;
 
+    @ApiModelProperty(value = "流程驳回集合")
+    private List<FlowRejectSequenceDto> approveRejectList;
+
+    public List<FlowRejectSequenceDto> getApproveRejectList() {
+        return approveRejectList;
+    }
+
+    public void setApproveRejectList(List<FlowRejectSequenceDto> approveRejectList) {
+        this.approveRejectList = approveRejectList;
+    }
+
     public List<FlowFormWidgetResult> getFormProperty() {
         return formProperty;
     }

+ 8 - 8
sop-business/src/main/java/com/qmth/sop/business/bean/result/FlowViewResult.java

@@ -31,8 +31,8 @@ public class FlowViewResult extends BaseFlowData implements Serializable {
     @ApiModelProperty(value = "流程状态")
     String statusStr;
 
-    @ApiModelProperty(value = "sopid")
-    String sopId;
+    @ApiModelProperty(value = "sop单号")
+    String sopNo;
 
     @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(value = "流程任务id集合")
@@ -51,10 +51,10 @@ public class FlowViewResult extends BaseFlowData implements Serializable {
 
     }
 
-    public FlowViewResult(Long flowId, FlowStatusEnum status, String sopId, List<Long> taskIdList, List<FlowTaskResult> flowTaskHistoryList, FlowTaskResult currFlowTaskResult, List<TFFlowViewLogResult> flowApproveHistoryList) {
+    public FlowViewResult(Long flowId, FlowStatusEnum status, String sopNo, List<Long> taskIdList, List<FlowTaskResult> flowTaskHistoryList, FlowTaskResult currFlowTaskResult, List<TFFlowViewLogResult> flowApproveHistoryList) {
         this.flowId = flowId;
         this.status = status;
-        this.sopId = sopId;
+        this.sopNo = sopNo;
         this.taskIdList = taskIdList;
         this.flowTaskHistoryList = flowTaskHistoryList;
         this.flowApproveHistoryList = flowApproveHistoryList;
@@ -89,12 +89,12 @@ public class FlowViewResult extends BaseFlowData implements Serializable {
         this.statusStr = statusStr;
     }
 
-    public String getSopId() {
-        return sopId;
+    public String getSopNo() {
+        return sopNo;
     }
 
-    public void setSopId(String sopId) {
-        this.sopId = sopId;
+    public void setSopNo(String sopNo) {
+        this.sopNo = sopNo;
     }
 
     public List<Long> getTaskIdList() {

+ 1 - 1
sop-business/src/main/resources/mapper/SysUserMapper.xml

@@ -25,7 +25,7 @@
                     tfcfe.id as customFlowEntityid
                 from
                     ACT_RU_TASK art
-                        left join t_f_flow_approve tffa on tffa.flow_id = tffa.flow_id
+                        left join t_f_flow_approve tffa on art.PROC_INST_ID_ = tffa.flow_id
                         left join t_f_custom_flow_entity tfcfe on tfcfe.flow_id = tffa.flow_id
                         left join t_f_custom_flow tfcf on tfcf.id = tfcfe.t_f_custom_flow_id
                         left join sys_user c ON art.ASSIGNEE_ = c.id

+ 2 - 0
sop-common/src/main/java/com/qmth/sop/common/contant/SystemConstant.java

@@ -194,6 +194,7 @@ public class SystemConstant {
     public static final String BPMN_PREFIX = ".bpmn";
     public static final String END_EVENT = "endEvent";
     public static final String USER_TASK = "userTask";
+    public static final String START_EVENT = "startEvent";
     public static final String NAME = "name";
     public static final String ID = "id";
     public static final String FORM_KEY = "formKey";
@@ -204,6 +205,7 @@ public class SystemConstant {
     public static final String DEFAULT_ASSIGNEE_LIST = "assigneeList";
     public static final String NR_OF_COMPLETED_INSTANCES = "nrOfCompletedInstances";
     public static final String NR_OF_INSTANCES = "nrOfInstances";
+    public static final String ARRROVE_REJECT_MAP = "approveRejectMap";
 
     /**
      * 锁

+ 1 - 1
sop-server/src/main/resources/qualityProblemFlow.bpmn

@@ -2,7 +2,7 @@
 <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:tns="http://www.activiti.org/test" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test" id="m1626068475250" name="">
   <process id="QUALITY_PROBLEM_FLOW" isExecutable="true" isClosed="false" processType="None">
     <userTask id="f_usertask_quality_problem_approve_2" name="项目计划变更审核" activiti:candidateUsers="${assigneeList2}" activiti:formKey="quality_problem_approve.form"></userTask>
-    <startEvent id="startevent1" name="Start"></startEvent>
+    <startEvent id="startevent1" name="Start" activiti:formKey="quality_problem_start.form"></startEvent>
     <userTask id="f_usertask_quality_problem_apply_1" name="质量问题反馈申请" activiti:assignee="${assignee1}" activiti:formKey="quality_problem_apply.form">
       <multiInstanceLoopCharacteristics isSequential="false" activiti:collection="${assigneeList1}" activiti:elementVariable="assignee1">
         <completionCondition>${nrOfCompletedInstances/nrOfInstances==1 || reject1==1}</completionCondition>

BIN
sop-server/src/main/resources/qualityProblemFlow.zip


+ 1 - 0
sop-server/src/main/resources/quality_problem_start.form

@@ -0,0 +1 @@
+{"approveRejectMap":{"f_usertask_quality_problem_approve_2":[{"afterFlowTaskKey":"f_usertask_quality_problem_apply_1","setup":1}],"f_usertask_quality_problem_check_3":[{"afterFlowTaskKey":"f_usertask_quality_problem_approve_2","setup":2}],"f_usertask_quality_problem_third_check_4":[{"afterFlowTaskKey":"f_usertask_quality_problem_approve_2","setup":2}]}}