From 4ac4be0284c0a9abf74a0b0ed14e95befa550779 Mon Sep 17 00:00:00 2001 From: "Mr. Lan" Date: Thu, 8 Oct 2020 20:48:36 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=BB=BA=E5=B7=A5=E5=8D=95?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=8E=92=E4=BB=96=E7=BD=91=E5=85=B3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apis/process/workOrder.go | 85 ++++++++++++++++++++++++++++++++++++--- pkg/service/getState.go | 1 - pkg/service/handle.go | 6 +-- 3 files changed, 83 insertions(+), 9 deletions(-) diff --git a/apis/process/workOrder.go b/apis/process/workOrder.go index 50582df..be26e6c 100644 --- a/apis/process/workOrder.go +++ b/apis/process/workOrder.go @@ -64,6 +64,9 @@ func CreateWorkOrder(c *gin.Context) { processValue process.Info sendToUserList []system.SysUser noticeList []int + handle service.Handle + processState service.ProcessState + condExprStatus bool workOrderValue struct { process.WorkOrderInfo Tpls map[string][]interface{} `json:"tpls"` @@ -102,11 +105,6 @@ func CreateWorkOrder(c *gin.Context) { app.Error(c, -1, err, fmt.Sprintf("获取处理人变量值失败,%v", err.Error())) return } - workOrderValue.State, err = json.Marshal(variableValue) - if err != nil { - app.Error(c, -1, err, "") - return - } // 创建工单数据 tx := orm.Eloquent.Begin() @@ -114,6 +112,83 @@ func CreateWorkOrder(c *gin.Context) { // 查询流程信息 err = tx.Model(&processValue).Where("id = ?", workOrderValue.Process).Find(&processValue).Error if err != nil { + app.Error(c, -1, err, "") + return + } + + err = json.Unmarshal(processValue.Structure, &processState.Structure) + nodeValue, err := processState.GetNode(variableValue[0].(map[string]interface{})["id"].(string)) + if err != nil { + app.Error(c, -1, err, "") + return + } + + for _, v := range workOrderValue.Tpls["form_data"] { + tpl, err := json.Marshal(v) + if err != nil { + app.Error(c, -1, err, "") + return + } + handle.WorkOrderData = append(handle.WorkOrderData, tpl) + } + + switch nodeValue["clazz"] { + // 排他网关 + case "exclusiveGateway": + sourceEdges, err := processState.GetEdge(nodeValue["id"].(string), "source") + if err != nil { + app.Error(c, -1, err, "") + return + } + breakTag: + for _, edge := range sourceEdges { + edgeCondExpr := make([]map[string]interface{}, 0) + err = json.Unmarshal([]byte(edge["conditionExpression"].(string)), &edgeCondExpr) + if err != nil { + app.Error(c, -1, err, "") + return + } + for _, condExpr := range edgeCondExpr { + // 条件判断 + condExprStatus, err = handle.ConditionalJudgment(condExpr) + if err != nil { + app.Error(c, -1, err, "") + return + } + if condExprStatus { + // 进行节点跳转 + nodeValue, err = processState.GetNode(edge["target"].(string)) + if err != nil { + app.Error(c, -1, err, "") + return + } + + if nodeValue["clazz"] == "userTask" || nodeValue["clazz"] == "receiveTask" { + if nodeValue["assignValue"] == nil || nodeValue["assignType"] == "" { + app.Error(c, -1, errors.New("处理人不能为空"), "") + return + } + } + variableValue[0].(map[string]interface{})["id"] = nodeValue["id"].(string) + variableValue[0].(map[string]interface{})["label"] = nodeValue["label"] + variableValue[0].(map[string]interface{})["processor"] = nodeValue["assignValue"] + variableValue[0].(map[string]interface{})["process_method"] = nodeValue["assignType"] + break breakTag + } + } + } + if !condExprStatus { + app.Error(c, -1, errors.New("所有流转均不符合条件,请确认。"), "") + return + } + case "parallelGateway": + app.Error(c, -1, fmt.Errorf("新建工单无法使用并行网关,%v", err), "") + return + } + + workOrderValue.State, err = json.Marshal(variableValue) + if err != nil { + app.Error(c, -1, err, "") return } diff --git a/pkg/service/getState.go b/pkg/service/getState.go index 92601d5..5751265 100644 --- a/pkg/service/getState.go +++ b/pkg/service/getState.go @@ -20,7 +20,6 @@ func (p *ProcessState) GetNode(stateId string) (nodeValue map[string]interface{} nodeValue = node } } - return } diff --git a/pkg/service/handle.go b/pkg/service/handle.go index 1f6e5a2..84714b6 100644 --- a/pkg/service/handle.go +++ b/pkg/service/handle.go @@ -44,7 +44,7 @@ type Handle struct { updateValue map[string]interface{} stateValue map[string]interface{} targetStateValue map[string]interface{} - workOrderData [][]byte + WorkOrderData [][]byte workOrderDetails process.WorkOrderInfo endHistory bool flowProperties int @@ -159,7 +159,7 @@ func (h *Handle) ConditionalJudgment(condExpr map[string]interface{}) (result bo } }() - for _, data := range h.workOrderData { + for _, data := range h.WorkOrderData { var formData map[string]interface{} err = json.Unmarshal(data, &formData) if err != nil { @@ -401,7 +401,7 @@ func (h *Handle) HandleWorkOrder( // 获取工单数据 err = orm.Eloquent.Model(&process.TplData{}). Where("work_order = ?", workOrderId). - Pluck("form_data", &h.workOrderData).Error + Pluck("form_data", &h.WorkOrderData).Error if err != nil { return }