|
|
|
|
package taskmanagement
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"appPlatform/models/customerForm"
|
|
|
|
|
"appPlatform/models/flowlog"
|
|
|
|
|
"appPlatform/models/modelAppPlatform"
|
|
|
|
|
"appPlatform/models/modelshr"
|
|
|
|
|
"appPlatform/models/reviseform"
|
|
|
|
|
"appPlatform/overall"
|
|
|
|
|
"appPlatform/overall/publicmethod"
|
|
|
|
|
"encoding/json"
|
|
|
|
|
"fmt"
|
|
|
|
|
"strconv"
|
|
|
|
|
"strings"
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*
|
|
|
|
|
@ 作者: 秦东
|
|
|
|
|
@ 时间: 2024-04-10 08:26:53
|
|
|
|
|
@ 功能: 发起流程
|
|
|
|
|
@ 参数
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
@ 返回值
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
@ 方法原型
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
*/
|
|
|
|
|
func (a *ApiMethod) StartRunWorkFlow(c *gin.Context) {
|
|
|
|
|
var requestData StartWorkFlow
|
|
|
|
|
err := c.ShouldBindJSON(&requestData)
|
|
|
|
|
if err != nil {
|
|
|
|
|
publicmethod.Result(10001, err, c, "未知进程!不可执行")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
var taskInfo customerForm.TaskRecord
|
|
|
|
|
if requestData.Id == "" {
|
|
|
|
|
//获取当前任务内容
|
|
|
|
|
// taskInfo.EiteCont(map[string]interface{}{"`masters_key`": requestData.Id}, map[string]interface{}{"`status`": 1})
|
|
|
|
|
publicmethod.Result(10001, err, c, "未知进程!不可执行")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if len(requestData.FlowList) < 1 {
|
|
|
|
|
//获取当前任务内容
|
|
|
|
|
taskInfo.EiteCont(map[string]interface{}{"`masters_key`": requestData.Id}, map[string]interface{}{"`status`": 1})
|
|
|
|
|
publicmethod.Result(10001, err, c, "未知进程!不可执行")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if requestData.State == 0 {
|
|
|
|
|
requestData.State = 3
|
|
|
|
|
}
|
|
|
|
|
context, _ := c.Get(overall.MyContJwt)
|
|
|
|
|
var userCont modelshr.ManCont
|
|
|
|
|
userCont.GetLoginCont(context) //当前操作人
|
|
|
|
|
creetTime := time.Now().Unix() //当前时间
|
|
|
|
|
// //获取当前任务内容
|
|
|
|
|
// var taskInfo customerForm.TaskRecord
|
|
|
|
|
taskInfo.GetCont(map[string]interface{}{"`masters_key`": requestData.Id}, "`flow_key`", "`flow_run_sing`")
|
|
|
|
|
//获取流程详情
|
|
|
|
|
var flowVersionInfo modelAppPlatform.WorkFlowVersion
|
|
|
|
|
flowVersionInfo.GetCont(map[string]interface{}{"`id`": taskInfo.FlowRunSing}, "`content`")
|
|
|
|
|
|
|
|
|
|
uuid := publicmethod.GetUUid(1)
|
|
|
|
|
runUuId := publicmethod.GetUUid(6)
|
|
|
|
|
//执行工作流内容
|
|
|
|
|
var workFlowInfo customerForm.RunWorkflow
|
|
|
|
|
workFlowInfo.Id = uuid
|
|
|
|
|
workFlowInfo.FlowKey = taskInfo.FlowKey //统一识别符(任务标识符)
|
|
|
|
|
workFlowInfo.Version = strconv.FormatInt(taskInfo.FlowRunSing, 10) //工作流版本
|
|
|
|
|
workFlowInfo.VersionCont = flowVersionInfo.Content //当前工作流内容
|
|
|
|
|
workFlowInfo.Creater = userCont.Key //流程发起人
|
|
|
|
|
workFlowInfo.Status = requestData.State //状态:1、草稿;2:驳回;3:审批中;4:归档;5:删除
|
|
|
|
|
workFlowInfo.StartTime = creetTime //开始时间
|
|
|
|
|
workFlowInfo.UpdateTime = creetTime //更新时间
|
|
|
|
|
workFlowInfo.RunKey = runUuId //当前执行识别符
|
|
|
|
|
|
|
|
|
|
startCreaterKey := strconv.FormatInt(userCont.Key, 10) //当前操作人
|
|
|
|
|
|
|
|
|
|
//执行流程
|
|
|
|
|
var executeWorkflow RunWorkFlow
|
|
|
|
|
executeWorkflow.Step = 0 //执行第几部
|
|
|
|
|
executeWorkflow.FlowList = requestData.FlowList
|
|
|
|
|
executeWorkflow.Participant = append(executeWorkflow.Participant, startCreaterKey)
|
|
|
|
|
executeWorkflow.TotalSteps = len(requestData.FlowList) //流程总长度
|
|
|
|
|
executeWorkflow.Uuid = uuid //流程唯一识别符
|
|
|
|
|
executeWorkflow.RunUid = runUuId //执行Uid
|
|
|
|
|
if requestData.State == 3 {
|
|
|
|
|
executeWorkflow.GainRunNode(startCreaterKey, 2, "发起审批")
|
|
|
|
|
} else {
|
|
|
|
|
executeWorkflow.GainRunNode(startCreaterKey, 1, "")
|
|
|
|
|
}
|
|
|
|
|
flowJsonCont, _ := json.Marshal(executeWorkflow.FlowList) //将步进流转化成json流
|
|
|
|
|
workFlowInfo.FlowCont = string(flowJsonCont) //流程执行体
|
|
|
|
|
if requestData.State == 3 {
|
|
|
|
|
workFlowInfo.CurrentStep = executeWorkflow.Step
|
|
|
|
|
workFlowInfo.NextStep = executeWorkflow.NextStep
|
|
|
|
|
//参与人去重
|
|
|
|
|
var parUser []string
|
|
|
|
|
for _, v := range executeWorkflow.Participant {
|
|
|
|
|
if !publicmethod.IsInTrue[string](v, parUser) {
|
|
|
|
|
parUser = append(parUser, v)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
workFlowInfo.Participants = strings.Join(parUser, ",")
|
|
|
|
|
nextRunUser := executeWorkflow.NextRunNodeUser(1)
|
|
|
|
|
workFlowInfo.NextExecutor = strings.Join(nextRunUser, ",")
|
|
|
|
|
if executeWorkflow.NextStep <= 0 {
|
|
|
|
|
workFlowInfo.Status = 4
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
fmt.Printf("步进值-1--%v---->%v》", executeWorkflow.Step, executeWorkflow.NextStep)
|
|
|
|
|
err = workFlowInfo.WriteCont() //写入执行工作流
|
|
|
|
|
if err != nil {
|
|
|
|
|
var taskInfo customerForm.TaskRecord
|
|
|
|
|
taskInfo.EiteCont(map[string]interface{}{"`masters_key`": requestData.Id}, map[string]interface{}{"`status`": 1})
|
|
|
|
|
publicmethod.Result(10001, err, c, "流程写入失败!请重新发起")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if executeWorkflow.NextStep <= 0 {
|
|
|
|
|
var taskCont customerForm.TaskRecord
|
|
|
|
|
taskCont.EiteCont(map[string]interface{}{"`masters_key`": requestData.Id}, map[string]interface{}{"`status`": 4, "`runFlowId`": uuid})
|
|
|
|
|
} else {
|
|
|
|
|
var taskCont customerForm.TaskRecord
|
|
|
|
|
taskCont.EiteCont(map[string]interface{}{"`masters_key`": requestData.Id}, map[string]interface{}{"`status`": requestData.State, "`runFlowId`": uuid})
|
|
|
|
|
}
|
|
|
|
|
publicmethod.Result(0, err, c)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*
|
|
|
|
|
@ 作者: 秦东
|
|
|
|
|
@ 时间: 2024-04-10 09:50:37
|
|
|
|
|
@ 功能: 获取下一步执行人
|
|
|
|
|
@ 参数
|
|
|
|
|
|
|
|
|
|
#isTrue 1:本节点审批完毕;非1:本节点还有未操作的人
|
|
|
|
|
|
|
|
|
|
@ 返回值
|
|
|
|
|
|
|
|
|
|
#userAry 下一步执行人
|
|
|
|
|
|
|
|
|
|
@ 方法原型
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
*/
|
|
|
|
|
func (r *RunWorkFlow) NextRunNodeUser(isTrue int) (userAry []string) {
|
|
|
|
|
if r.NextStep <= 0 {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if isTrue == 1 {
|
|
|
|
|
curStep := r.Step + 1
|
|
|
|
|
if curStep > r.TotalSteps {
|
|
|
|
|
curStep = r.TotalSteps
|
|
|
|
|
}
|
|
|
|
|
for _, v := range r.FlowList {
|
|
|
|
|
if v.Step == curStep {
|
|
|
|
|
for _, op := range v.Operator {
|
|
|
|
|
if !publicmethod.IsInTrue[string](op.Id, userAry) {
|
|
|
|
|
userAry = append(userAry, op.Id)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if r.Step == 1 {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
for _, v := range r.FlowList {
|
|
|
|
|
if v.Step == r.Step {
|
|
|
|
|
for _, op := range v.Operator {
|
|
|
|
|
if !publicmethod.IsInTrue[string](op.Id, userAry) {
|
|
|
|
|
userAry = append(userAry, op.Id)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*
|
|
|
|
|
@ 作者: 秦东
|
|
|
|
|
@ 时间: 2024-04-10 09:03:40
|
|
|
|
|
@ 功能: 执行工作流
|
|
|
|
|
@ 参数
|
|
|
|
|
|
|
|
|
|
#userKey //当前执行人
|
|
|
|
|
#AgreeToRefuse 同意或者驳回
|
|
|
|
|
#runCont //执行意见
|
|
|
|
|
|
|
|
|
|
@ 返回值
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
@ 方法原型
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
*/
|
|
|
|
|
func (r *RunWorkFlow) GainRunNode(userKey string, AgreeToRefuse int, runCont string) {
|
|
|
|
|
userkInt, _ := strconv.ParseInt(userKey, 10, 64) //将字符型转换成64位整型
|
|
|
|
|
curStep := 1
|
|
|
|
|
if r.Step != 0 {
|
|
|
|
|
curStep = r.Step
|
|
|
|
|
}
|
|
|
|
|
for i := 0; i < r.TotalSteps; i++ {
|
|
|
|
|
if r.FlowList[i].Step == curStep { //获取正在执行得节点
|
|
|
|
|
currentStep, nextStep := PaceStep(r.RunUid, r.Step, r.TotalSteps, r.FlowList[i]) //获取当前步进值和下一步步进值
|
|
|
|
|
operatorAry, nodeUser := FindOperator(userKey, r.RunUid, AgreeToRefuse, r.FlowList[i].Operator, runCont)
|
|
|
|
|
r.FlowList[i].Operator = operatorAry
|
|
|
|
|
r.FlowList[i].Status = AgreeToRefuse
|
|
|
|
|
r.Participant = append(r.Participant, nodeUser...)
|
|
|
|
|
fmt.Printf("节点类型设置---->%v---->%v---->%v\n", r.FlowList[i].Types, currentStep, nextStep)
|
|
|
|
|
switch r.FlowList[i].Types { //0:发起节点;1:审批节点;2:抄送;3:执行节点
|
|
|
|
|
case 0:
|
|
|
|
|
r.Step = currentStep
|
|
|
|
|
r.NextStep = nextStep
|
|
|
|
|
FlowRunLog(r.Uuid, userkInt, AgreeToRefuse, r.FlowList[i].NodeKey, runCont, "")
|
|
|
|
|
if JudgeRunNode(currentStep, r.FlowList) {
|
|
|
|
|
r.GainRunNode(userKey, AgreeToRefuse, runCont)
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
case 1:
|
|
|
|
|
r.Step = currentStep
|
|
|
|
|
r.NextStep = nextStep
|
|
|
|
|
return
|
|
|
|
|
case 2:
|
|
|
|
|
r.Step = currentStep
|
|
|
|
|
r.NextStep = nextStep
|
|
|
|
|
for _, op := range r.FlowList[i].Operator {
|
|
|
|
|
userkIntId, _ := strconv.ParseInt(op.Id, 10, 64)
|
|
|
|
|
title := fmt.Sprintf("向%v发送抄送数据", op.Name)
|
|
|
|
|
FlowRunLog(r.Uuid, userkIntId, AgreeToRefuse, r.FlowList[i].NodeKey, title, "")
|
|
|
|
|
}
|
|
|
|
|
if r.NextStep > 0 {
|
|
|
|
|
r.GainRunNode(userKey, AgreeToRefuse, runCont)
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
case 3:
|
|
|
|
|
r.Step = currentStep
|
|
|
|
|
r.NextStep = nextStep
|
|
|
|
|
return
|
|
|
|
|
default:
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*
|
|
|
|
|
@ 作者: 秦东
|
|
|
|
|
@ 时间: 2024-04-10 09:41:46
|
|
|
|
|
@ 功能: 判断当前节点是否要继续执行
|
|
|
|
|
@ 参数
|
|
|
|
|
|
|
|
|
|
#step 当前步进值
|
|
|
|
|
#FlowList 流程内容
|
|
|
|
|
|
|
|
|
|
@ 返回值
|
|
|
|
|
|
|
|
|
|
#isRun 是否继续执行
|
|
|
|
|
|
|
|
|
|
@ 方法原型
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
*/
|
|
|
|
|
func JudgeRunNode(step int, FlowList []RunFlow) (isRun bool) {
|
|
|
|
|
isRun = false
|
|
|
|
|
for _, v := range FlowList {
|
|
|
|
|
if v.Step == step {
|
|
|
|
|
if v.Types == 2 {
|
|
|
|
|
isRun = true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*
|
|
|
|
|
@ 作者: 秦东
|
|
|
|
|
@ 时间: 2024-12-13 11:26:32
|
|
|
|
|
@ 功能: 判断下一个节点是否继续执行
|
|
|
|
|
@ 参数
|
|
|
|
|
|
|
|
|
|
#userKey 当前执行人
|
|
|
|
|
#nextStep 下一个节点
|
|
|
|
|
|
|
|
|
|
@ 返回值
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
@ 方法原型
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
*/
|
|
|
|
|
func (r *RunWorkFlow) ToNextNodeRunOrClose(userKey string, nextStep int) (isRun bool) {
|
|
|
|
|
isRun = false
|
|
|
|
|
if nextStep == 0 {
|
|
|
|
|
return isRun
|
|
|
|
|
}
|
|
|
|
|
runIdStr := strconv.FormatInt(r.RunUid, 10)
|
|
|
|
|
fmt.Printf("判断下一个节点是否继续执行:userKey:%v------->nextStep:%v\n", userKey, nextStep)
|
|
|
|
|
for _, v := range r.FlowList {
|
|
|
|
|
if nextStep == v.Step {
|
|
|
|
|
fmt.Printf("判断下一个节点是否继续执行:v.Step:%v----1--->v.Types:%v\n", v.Step, v.Types)
|
|
|
|
|
switch v.Types {
|
|
|
|
|
case 1, 3:
|
|
|
|
|
isMyTrue := false
|
|
|
|
|
optUserCount := len(v.Operator)
|
|
|
|
|
allPick := 0
|
|
|
|
|
for _, ov := range v.Operator {
|
|
|
|
|
if ov.Id == userKey {
|
|
|
|
|
isMyTrue = true
|
|
|
|
|
}
|
|
|
|
|
for _, ol := range ov.LogList {
|
|
|
|
|
if runIdStr == ol.UID {
|
|
|
|
|
allPick++
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if isMyTrue {
|
|
|
|
|
if optUserCount > 1 {
|
|
|
|
|
switch v.ExamineMode {
|
|
|
|
|
case 1, 2:
|
|
|
|
|
if allPick == 0 {
|
|
|
|
|
isRun = true
|
|
|
|
|
} else {
|
|
|
|
|
if allPick == optUserCount {
|
|
|
|
|
isRun = true
|
|
|
|
|
} else {
|
|
|
|
|
isRun = false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
isRun = true
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if optUserCount == 1 {
|
|
|
|
|
isRun = true
|
|
|
|
|
} else {
|
|
|
|
|
isRun = false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// isRun = true
|
|
|
|
|
}
|
|
|
|
|
fmt.Printf("判断下一个节点是否继续执行:isMyTrue:%v----3--->isRun:%v\n----3--->optUserCount:%v\n----3--->v.ExamineMode:%v\n", isMyTrue, isRun, optUserCount, v.ExamineMode)
|
|
|
|
|
case 2:
|
|
|
|
|
isRun = true
|
|
|
|
|
default:
|
|
|
|
|
isRun = false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return isRun
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*
|
|
|
|
|
@ 作者: 秦东
|
|
|
|
|
@ 时间: 2024-04-10 09:37:01
|
|
|
|
|
@ 功能: 流程执行记录
|
|
|
|
|
@ 参数
|
|
|
|
|
|
|
|
|
|
#uuid 流程uuid
|
|
|
|
|
#userKey 操作人
|
|
|
|
|
#AgreeToRefuse 同意或者驳回
|
|
|
|
|
#nodeKey 操作得节点
|
|
|
|
|
#idea 意见
|
|
|
|
|
#annex 附件
|
|
|
|
|
|
|
|
|
|
@ 返回值
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
@ 方法原型
|
|
|
|
|
|
|
|
|
|
#func FlowRunLog(uuid, userKey int64, AgreeToRefuse int, nodeKey, idea, annex string)
|
|
|
|
|
*/
|
|
|
|
|
func FlowRunLog(uuid, userKey int64, AgreeToRefuse int, nodeKey, idea, annex string) {
|
|
|
|
|
creetTime := time.Now().Unix()
|
|
|
|
|
var flowRunLog flowlog.WorkFlowLog
|
|
|
|
|
flowRunLog.FlowId = uuid //执行的流程"`
|
|
|
|
|
flowRunLog.Creater = userKey //操作人"`
|
|
|
|
|
flowRunLog.Status = AgreeToRefuse //状态:1、草稿;2:驳回;3:通过;4:归档;5:删除"`
|
|
|
|
|
flowRunLog.Content = idea //审批意见"`
|
|
|
|
|
flowRunLog.Annex = annex //附件"`
|
|
|
|
|
flowRunLog.Time = creetTime //创建时间"`
|
|
|
|
|
flowRunLog.EditTime = creetTime //ault编辑时间"`
|
|
|
|
|
flowRunLog.NodeKey = nodeKey //操作得节点
|
|
|
|
|
flowRunLog.WriteCont()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*
|
|
|
|
|
@ 作者: 秦东
|
|
|
|
|
@ 时间: 2024-04-10 09:28:28
|
|
|
|
|
@ 功能: 操作人操作记录处理
|
|
|
|
|
@ 参数
|
|
|
|
|
|
|
|
|
|
#userKey 操作人
|
|
|
|
|
#runUid 执行Uid
|
|
|
|
|
#AgreeToRefuse 同意或者驳回
|
|
|
|
|
#operator 当前节点操作人
|
|
|
|
|
#suggest 审批意见
|
|
|
|
|
|
|
|
|
|
@ 返回值
|
|
|
|
|
|
|
|
|
|
#OperatorAry 操作人信息
|
|
|
|
|
#nodeUser 操作人唯一识别符
|
|
|
|
|
|
|
|
|
|
@ 方法原型
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
*/
|
|
|
|
|
func FindOperator(userKey string, runUid int64, AgreeToRefuse int, operator []OperatorList, suggest string) (OperatorAry []OperatorList, nodeUser []string) {
|
|
|
|
|
var logInfo LogList
|
|
|
|
|
logInfo.State = AgreeToRefuse //状态 1、未操作;2、通过;3、驳回
|
|
|
|
|
logInfo.TimeVal = publicmethod.UnixTimeToDay(time.Now().Unix(), 1)
|
|
|
|
|
logInfo.UID = strconv.FormatInt(runUid, 10)
|
|
|
|
|
logInfo.Cause = suggest
|
|
|
|
|
isNewAdd := true
|
|
|
|
|
for _, v := range operator {
|
|
|
|
|
nodeUser = append(nodeUser, v.Id)
|
|
|
|
|
// fmt.Printf("判断人员是谁?v.Id:%v == userKey:%v\n", v.Id, userKey)
|
|
|
|
|
if v.Id == userKey {
|
|
|
|
|
v.LogList = append(v.LogList, logInfo)
|
|
|
|
|
isNewAdd = false
|
|
|
|
|
}
|
|
|
|
|
OperatorAry = append(OperatorAry, v)
|
|
|
|
|
}
|
|
|
|
|
if isNewAdd {
|
|
|
|
|
var myInfo modelshr.ManCont
|
|
|
|
|
myInfo.GetCont(map[string]interface{}{"`key`": userKey})
|
|
|
|
|
nodeMan := TransformPublicUs(myInfo)
|
|
|
|
|
nodeMan.LogList = append(nodeMan.LogList, logInfo)
|
|
|
|
|
OperatorAry = append(OperatorAry, nodeMan)
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*
|
|
|
|
|
@ 作者: 秦东
|
|
|
|
|
@ 时间: 2024-04-10 09:15:45
|
|
|
|
|
@ 功能: 计算工作流执行得步伐
|
|
|
|
|
@ 参数
|
|
|
|
|
|
|
|
|
|
#runId 执行工作流唯一识别符
|
|
|
|
|
#step 当前执行得步进值
|
|
|
|
|
#totalSteps 总步数
|
|
|
|
|
#nodeInfo 节点内容
|
|
|
|
|
|
|
|
|
|
@ 返回值
|
|
|
|
|
|
|
|
|
|
#currentStep 当前步进值
|
|
|
|
|
#nextStep 下一步步进值
|
|
|
|
|
|
|
|
|
|
@ 方法原型
|
|
|
|
|
|
|
|
|
|
#func PaceStep(runId int64, step, totalSteps int, nodeInfo RunFlow) (currentStep, nextStep int)
|
|
|
|
|
*/
|
|
|
|
|
func PaceStep(runId int64, step, totalSteps int, nodeInfo RunFlow) (currentStep, nextStep int) {
|
|
|
|
|
if nodeInfo.ExamineMode == 0 { //多人审批时采用的审批方式。0:无操作 1依次审批 2会签 3:非会签
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
duoren, _ := json.Marshal(nodeInfo)
|
|
|
|
|
fmt.Printf("当前操作节点----->%v\n", string(duoren))
|
|
|
|
|
switch nodeInfo.ExamineMode {
|
|
|
|
|
case 0:
|
|
|
|
|
if step >= totalSteps {
|
|
|
|
|
currentStep = totalSteps
|
|
|
|
|
nextStep = 0
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
currentStep = step + 1
|
|
|
|
|
if currentStep >= totalSteps {
|
|
|
|
|
currentStep = totalSteps
|
|
|
|
|
nextStep = 0
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
nextStep = currentStep + 1
|
|
|
|
|
if nextStep >= totalSteps {
|
|
|
|
|
nextStep = totalSteps
|
|
|
|
|
}
|
|
|
|
|
case 3:
|
|
|
|
|
if step >= totalSteps {
|
|
|
|
|
currentStep = totalSteps
|
|
|
|
|
nextStep = 0
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
currentStep = step
|
|
|
|
|
if currentStep >= totalSteps {
|
|
|
|
|
currentStep = totalSteps
|
|
|
|
|
nextStep = 0
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
nextStep = currentStep + 1
|
|
|
|
|
if nextStep >= totalSteps {
|
|
|
|
|
nextStep = totalSteps
|
|
|
|
|
}
|
|
|
|
|
default:
|
|
|
|
|
runIdStr := strconv.FormatInt(runId, 10)
|
|
|
|
|
allUser := len(nodeInfo.Operator)
|
|
|
|
|
jiBuQi := 1
|
|
|
|
|
for _, v := range nodeInfo.Operator {
|
|
|
|
|
if len(v.LogList) > 0 {
|
|
|
|
|
for _, m := range v.LogList {
|
|
|
|
|
if m.UID == runIdStr {
|
|
|
|
|
jiBuQi++
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
jiBuQi++
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
if allUser <= jiBuQi { //全部审批完毕
|
|
|
|
|
if step >= totalSteps {
|
|
|
|
|
currentStep = totalSteps
|
|
|
|
|
nextStep = 0
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
currentStep = step
|
|
|
|
|
if currentStep >= totalSteps {
|
|
|
|
|
currentStep = totalSteps
|
|
|
|
|
nextStep = 0
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
nextStep = currentStep + 1
|
|
|
|
|
if nextStep >= totalSteps {
|
|
|
|
|
nextStep = totalSteps
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
currentStep = step - 1
|
|
|
|
|
if currentStep <= 0 {
|
|
|
|
|
currentStep = 1
|
|
|
|
|
}
|
|
|
|
|
if currentStep >= totalSteps {
|
|
|
|
|
currentStep = totalSteps
|
|
|
|
|
nextStep = 0
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
nextStep = currentStep + 1
|
|
|
|
|
if nextStep >= totalSteps {
|
|
|
|
|
nextStep = totalSteps
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*
|
|
|
|
|
@ 作者: 秦东
|
|
|
|
|
@ 时间: 2024-04-10 10:28:37
|
|
|
|
|
@ 功能: 从草稿箱发起审批
|
|
|
|
|
@ 参数
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
@ 返回值
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
@ 方法原型
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
*/
|
|
|
|
|
func (a *ApiMethod) DraftsInitiateApproval(c *gin.Context) {
|
|
|
|
|
var requestData StartWorkFlow
|
|
|
|
|
err := c.ShouldBindJSON(&requestData)
|
|
|
|
|
if err != nil {
|
|
|
|
|
publicmethod.Result(100, err, c)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if requestData.Id == "" {
|
|
|
|
|
publicmethod.Result(100, err, c, "未知进程!不可执行")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if len(requestData.FlowList) < 1 {
|
|
|
|
|
publicmethod.Result(100, err, c, "未知进程!不可执行")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if requestData.State == 0 {
|
|
|
|
|
requestData.State = 3
|
|
|
|
|
}
|
|
|
|
|
context, _ := c.Get(overall.MyContJwt)
|
|
|
|
|
var userCont modelshr.ManCont
|
|
|
|
|
userCont.GetLoginCont(context) //当前操作人
|
|
|
|
|
creetTime := time.Now().Unix() //当前时间
|
|
|
|
|
var runInfo customerForm.RunWorkflow
|
|
|
|
|
err = runInfo.GetCont(map[string]interface{}{"`id`": requestData.Id}, "`flow_cont`", "`current_step`", "`runKey`", "`participants`")
|
|
|
|
|
if err != nil {
|
|
|
|
|
publicmethod.Result(107, err, c)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if len(requestData.FlowList) < 1 && runInfo.FlowCont != "" {
|
|
|
|
|
json.Unmarshal([]byte(runInfo.FlowCont), &requestData.FlowList)
|
|
|
|
|
}
|
|
|
|
|
startUs := strconv.FormatInt(userCont.Key, 10) //当前操作人
|
|
|
|
|
//执行流程
|
|
|
|
|
var runFlow RunWorkFlow
|
|
|
|
|
runFlow.Step = 0 //执行第几部
|
|
|
|
|
runFlow.FlowList = requestData.FlowList
|
|
|
|
|
runFlow.Participant = append(runFlow.Participant, startUs)
|
|
|
|
|
runFlow.TotalSteps = len(requestData.FlowList) //流程总长度
|
|
|
|
|
runFlow.Uuid = runInfo.FlowKey
|
|
|
|
|
runFlow.RunUid = runInfo.RunKey
|
|
|
|
|
if requestData.State == 3 {
|
|
|
|
|
runFlow.GainRunNode(startUs, 2, "发起审批")
|
|
|
|
|
} else {
|
|
|
|
|
runFlow.GainRunNode(startUs, 1, "")
|
|
|
|
|
}
|
|
|
|
|
flowJsonCont, _ := json.Marshal(runFlow.FlowList) //将步进流转化成json流
|
|
|
|
|
saveTask := publicmethod.MapOut[string]()
|
|
|
|
|
saveFlow := publicmethod.MapOut[string]()
|
|
|
|
|
saveFlow["`flow_cont`"] = flowJsonCont
|
|
|
|
|
saveFlow["`current_step`"] = runFlow.Step
|
|
|
|
|
saveFlow["`next_step`"] = runFlow.NextStep
|
|
|
|
|
//参与人去重
|
|
|
|
|
var parUser []string
|
|
|
|
|
for _, v := range runFlow.Participant {
|
|
|
|
|
if !publicmethod.IsInTrue[string](v, parUser) {
|
|
|
|
|
parUser = append(parUser, v)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
saveFlow["`participants`"] = strings.Join(parUser, ",")
|
|
|
|
|
nextRunUser := runFlow.NextRunNodeUser(1)
|
|
|
|
|
saveFlow["`next_executor`"] = strings.Join(nextRunUser, ",")
|
|
|
|
|
saveFlow["`status`"] = requestData.State
|
|
|
|
|
saveTask["status"] = requestData.State
|
|
|
|
|
if runFlow.NextStep <= 0 {
|
|
|
|
|
saveFlow["`status`"] = 4
|
|
|
|
|
saveTask["status"] = 4
|
|
|
|
|
}
|
|
|
|
|
if requestData.State == 2 {
|
|
|
|
|
saveTask["status"] = 1
|
|
|
|
|
}
|
|
|
|
|
saveFlow["`update_time`"] = creetTime
|
|
|
|
|
saveTask["edit_time"] = creetTime
|
|
|
|
|
var saveRunInfo customerForm.RunWorkflow
|
|
|
|
|
err = saveRunInfo.EiteCont(map[string]interface{}{"`id`": requestData.Id}, saveFlow)
|
|
|
|
|
if err != nil {
|
|
|
|
|
publicmethod.Result(106, err, c)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
var saveTaskInfo customerForm.TaskRecord
|
|
|
|
|
saveTaskInfo.EiteCont(map[string]interface{}{"`runFlowId`": requestData.Id}, saveTask)
|
|
|
|
|
publicmethod.Result(0, err, c)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*
|
|
|
|
|
@ 作者: 秦东
|
|
|
|
|
@ 时间: 2024-04-10 12:58:51
|
|
|
|
|
@ 功能: 获取正在执行得任务流程
|
|
|
|
|
@ 参数
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
@ 返回值
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
@ 方法原型
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
*/
|
|
|
|
|
func (a *ApiMethod) GainRunTaskWorkflow(c *gin.Context) {
|
|
|
|
|
var requestData publicmethod.PublicId
|
|
|
|
|
err := c.ShouldBindJSON(&requestData)
|
|
|
|
|
if err != nil {
|
|
|
|
|
publicmethod.Result(200, err, c)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if requestData.Id == "" {
|
|
|
|
|
publicmethod.Result(200, err, c)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
var runFlowInfo customerForm.RunWorkflow
|
|
|
|
|
// err = runFlowInfo.GetCont(map[string]interface{}{"`flow_key`": requestData.Id})
|
|
|
|
|
err = runFlowInfo.GetCont(map[string]interface{}{"`id`": requestData.Id})
|
|
|
|
|
if err != nil || runFlowInfo.FlowCont == "" {
|
|
|
|
|
publicmethod.Result(200, err, c)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
context, _ := c.Get(overall.MyContJwt)
|
|
|
|
|
var userCont modelshr.ManCont
|
|
|
|
|
userCont.GetLoginCont(context) //当前操作人
|
|
|
|
|
var flowList []RunFlow
|
|
|
|
|
err = json.Unmarshal([]byte(runFlowInfo.FlowCont), &flowList)
|
|
|
|
|
if err != nil {
|
|
|
|
|
publicmethod.Result(200, err, c)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
//判断是否需要回写流程记录
|
|
|
|
|
flowAry, operational := CheckMakeCopy(runFlowInfo.FlowKey, runFlowInfo.RunKey, runFlowInfo.Status, runFlowInfo.CurrentStep, flowList, userCont)
|
|
|
|
|
if runFlowInfo.Status != 3 {
|
|
|
|
|
operational = false
|
|
|
|
|
}
|
|
|
|
|
sendMap := publicmethod.MapOut[string]()
|
|
|
|
|
sendMap["flowList"] = flowAry
|
|
|
|
|
sendMap["operational"] = operational
|
|
|
|
|
sendMap["current_step"] = runFlowInfo.CurrentStep
|
|
|
|
|
publicmethod.Result(0, sendMap, c)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*
|
|
|
|
|
@ 作者: 秦东
|
|
|
|
|
@ 时间: 2024-04-10 13:01:12
|
|
|
|
|
@ 功能: 检查当前人抄送是否查看
|
|
|
|
|
@ 参数
|
|
|
|
|
|
|
|
|
|
#uuid 流程唯一识别符
|
|
|
|
|
#endStep 当前步进值
|
|
|
|
|
#flowList 流程列表
|
|
|
|
|
#userCont 人员信息
|
|
|
|
|
|
|
|
|
|
@ 返回值
|
|
|
|
|
|
|
|
|
|
#flowMap 流程
|
|
|
|
|
#operational 是否可操作
|
|
|
|
|
|
|
|
|
|
@ 方法原型
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
*/
|
|
|
|
|
func CheckMakeCopy(uuid, runKey int64, state int, currepStep int, flowList []RunFlow, userCont modelshr.ManCont) (flowMap []RunFlow, operational bool) {
|
|
|
|
|
if len(flowList) < 1 {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
endStep := currepStep + 1
|
|
|
|
|
if endStep >= len(flowList) {
|
|
|
|
|
endStep = len(flowList)
|
|
|
|
|
}
|
|
|
|
|
operational = false
|
|
|
|
|
isWrite := false
|
|
|
|
|
userKey := strconv.FormatInt(userCont.Key, 10)
|
|
|
|
|
var cureeNode RunFlow
|
|
|
|
|
for i := 0; i < len(flowList); i++ { //梳理抄送节点
|
|
|
|
|
if flowList[i].Step == endStep {
|
|
|
|
|
|
|
|
|
|
cureeNode = flowList[i]
|
|
|
|
|
switch flowList[i].ExamineMode {
|
|
|
|
|
case 1:
|
|
|
|
|
operational = ApprovalInSequence(flowList[i].Operator, userCont)
|
|
|
|
|
case 2:
|
|
|
|
|
operational = NotSignJointly(runKey, state, flowList[i].Operator, userCont)
|
|
|
|
|
case 3:
|
|
|
|
|
operational = NotSignJointly(runKey, state, flowList[i].Operator, userCont)
|
|
|
|
|
default:
|
|
|
|
|
for m := 0; m < len(flowList[i].Operator); m++ {
|
|
|
|
|
if flowList[i].Operator[m].Id == userKey {
|
|
|
|
|
operational = true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// fmt.Printf("currepStep:%v---->endStep:%v\n", flowList[i].ExamineMode, operational)
|
|
|
|
|
}
|
|
|
|
|
if flowList[i].Types != 0 {
|
|
|
|
|
if flowList[i].Step <= endStep {
|
|
|
|
|
if flowList[i].Types == 2 {
|
|
|
|
|
flowList[i].RunType = 0
|
|
|
|
|
flowList[i].RunScope = 0
|
|
|
|
|
for j := 0; j < len(flowList[i].Operator); j++ {
|
|
|
|
|
if flowList[i].Operator[j].Id == userKey {
|
|
|
|
|
if len(flowList[i].Operator[j].LogList) < 1 {
|
|
|
|
|
var logCont LogList
|
|
|
|
|
logCont.State = 4 //状态 1、未操作;2、通过;3、驳回
|
|
|
|
|
logCont.TimeVal = publicmethod.UnixTimeToDay(time.Now().Unix(), 1)
|
|
|
|
|
flowList[i].Operator[j].LogList = append(flowList[i].Operator[j].LogList, logCont) //操作记录
|
|
|
|
|
isWrite = true
|
|
|
|
|
FlowRunLog(uuid, userCont.Key, 6, flowList[i].NodeKey, "查看抄送内容", "")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if isWrite {
|
|
|
|
|
flowJson, _ := json.Marshal(flowList)
|
|
|
|
|
var runFlowInfo modelAppPlatform.RunFlow
|
|
|
|
|
runFlowInfo.EiteCont(map[string]interface{}{"`flow_key`": uuid}, map[string]interface{}{"`flow_cont`": string(flowJson)})
|
|
|
|
|
}
|
|
|
|
|
// fmt.Printf("cureeNode.CustomNode =====> %v\n", cureeNode.NodeKey)
|
|
|
|
|
timeStep := endStep - 1
|
|
|
|
|
if timeStep <= 0 {
|
|
|
|
|
timeStep = 1
|
|
|
|
|
}
|
|
|
|
|
// fmt.Printf("operational--->%v\n", operational)
|
|
|
|
|
if operational {
|
|
|
|
|
for k := 0; k < len(flowList); k++ {
|
|
|
|
|
if flowList[k].Step <= endStep {
|
|
|
|
|
flowList[k].RunType = 0
|
|
|
|
|
flowList[k].RunScope = 0
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if flowList[k].Step >= endStep {
|
|
|
|
|
|
|
|
|
|
if flowList[k].CustomNode == cureeNode.NodeKey {
|
|
|
|
|
if flowList[k].RunScope == 0 {
|
|
|
|
|
flowList[k].RunScope = 1
|
|
|
|
|
}
|
|
|
|
|
// fmt.Printf("cureeNode.CustomNode =====> %v =====> %v =====> %v =====> %v\n", flowList[k].Step, endStep, flowList[k].CustomNode == cureeNode.NodeKey, flowList[timeStep].Operator)
|
|
|
|
|
|
|
|
|
|
for j := 0; j < len(flowList[timeStep].Operator); j++ {
|
|
|
|
|
|
|
|
|
|
if flowList[timeStep].Operator[j].Id == userKey {
|
|
|
|
|
flowList[k].JudgeList = true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
for k := 0; k < len(flowList); k++ {
|
|
|
|
|
flowList[k].JudgeList = false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
flowMap = flowList
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*
|
|
|
|
|
@ 作者: 秦东
|
|
|
|
|
@ 时间: 2024-04-10 13:04:49
|
|
|
|
|
@ 功能: 处理非会签情况
|
|
|
|
|
@ 参数
|
|
|
|
|
|
|
|
|
|
#Operator 节点操作人
|
|
|
|
|
#userCont 当前操作人
|
|
|
|
|
|
|
|
|
|
@ 返回值
|
|
|
|
|
|
|
|
|
|
#bool //是否可以操作
|
|
|
|
|
|
|
|
|
|
@ 方法原型
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
*/
|
|
|
|
|
func NotSignJointly(runKey int64, state int, Operator []OperatorList, userCont modelshr.ManCont) bool {
|
|
|
|
|
if len(Operator) < 1 {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
if state != 3 {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
userKey := strconv.FormatInt(userCont.Key, 10)
|
|
|
|
|
runKeyStr := strconv.FormatInt(runKey, 10)
|
|
|
|
|
for _, v := range Operator {
|
|
|
|
|
if v.Id == userKey {
|
|
|
|
|
for _, lv := range v.LogList {
|
|
|
|
|
if lv.UID == runKeyStr {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*
|
|
|
|
|
@ 作者: 秦东
|
|
|
|
|
@ 时间: 2024-04-10 13:03:20
|
|
|
|
|
@ 功能: 依次审批
|
|
|
|
|
@ 参数
|
|
|
|
|
|
|
|
|
|
#Operator 操作人
|
|
|
|
|
#userCont 当前执行人
|
|
|
|
|
|
|
|
|
|
@ 返回值
|
|
|
|
|
|
|
|
|
|
#bool //是否可以操作
|
|
|
|
|
|
|
|
|
|
@ 方法原型
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
*/
|
|
|
|
|
func ApprovalInSequence(Operator []OperatorList, userCont modelshr.ManCont) bool {
|
|
|
|
|
allAry := len(Operator)
|
|
|
|
|
|
|
|
|
|
if allAry < 1 {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
userKey := strconv.FormatInt(userCont.Key, 10)
|
|
|
|
|
if allAry == 1 {
|
|
|
|
|
for _, v := range Operator {
|
|
|
|
|
if v.Id == userKey {
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
minVal := 0
|
|
|
|
|
for _, v := range Operator {
|
|
|
|
|
if minVal <= len(v.LogList) {
|
|
|
|
|
minVal = len(v.LogList)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// fmt.Printf("依次审批--a-->%v---->%v---->%v\n", minVal, len(Operator), allAry)
|
|
|
|
|
if minVal == 0 {
|
|
|
|
|
for i, v := range Operator {
|
|
|
|
|
// fmt.Printf("依次审批---->%v---->%v\n", i, v.Name)
|
|
|
|
|
if v.Id == userKey {
|
|
|
|
|
if i == 0 {
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
endTrue := true
|
|
|
|
|
if allAry >= 2 {
|
|
|
|
|
for i := 0; i < allAry-2; i++ {
|
|
|
|
|
if len(Operator[i].LogList) <= minVal && len(Operator[i].LogList) <= len(Operator[i+1].LogList) {
|
|
|
|
|
if Operator[i].Id == userKey {
|
|
|
|
|
endTrue = false
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if endTrue {
|
|
|
|
|
if Operator[allAry-1].Id == userKey {
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*
|
|
|
|
|
@ 作者: 秦东
|
|
|
|
|
@ 时间: 2024-04-11 11:05:04
|
|
|
|
|
@ 功能: 重新发起流程
|
|
|
|
|
@ 参数
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
@ 返回值
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
@ 方法原型
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
*/
|
|
|
|
|
func (a *ApiMethod) AfreshRunWorkflow(c *gin.Context) {
|
|
|
|
|
var requestData publicmethod.PublicId
|
|
|
|
|
err := c.ShouldBindJSON(&requestData)
|
|
|
|
|
if err != nil {
|
|
|
|
|
publicmethod.Result(100, err, c)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if requestData.Id == "" {
|
|
|
|
|
publicmethod.Result(100, err, c)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
var runFlowInfo customerForm.RunWorkflow
|
|
|
|
|
err = runFlowInfo.GetCont(map[string]interface{}{"`id`": requestData.Id}, "`id`", "`next_executor`", "`current_step`", "`next_step`", "`participants`", "`flow_key`", "`flow_cont`", "`runKey`")
|
|
|
|
|
if err != nil {
|
|
|
|
|
publicmethod.Result(107, err, c)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
var flowList []RunFlow
|
|
|
|
|
err = json.Unmarshal([]byte(runFlowInfo.FlowCont), &flowList)
|
|
|
|
|
if err != nil {
|
|
|
|
|
publicmethod.Result(107, err, c)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
context, _ := c.Get(overall.MyContJwt)
|
|
|
|
|
var userCont modelshr.ManCont
|
|
|
|
|
userCont.GetLoginCont(context) //当前操作人
|
|
|
|
|
startUs := strconv.FormatInt(userCont.Key, 10) //当前操作人
|
|
|
|
|
runUuId := publicmethod.GetUUid(6)
|
|
|
|
|
//执行流程
|
|
|
|
|
var runFlow RunWorkFlow
|
|
|
|
|
runFlow.Step = 0 //执行第几部
|
|
|
|
|
runFlow.FlowList = flowList
|
|
|
|
|
runFlow.Participant = append(runFlow.Participant, startUs)
|
|
|
|
|
runFlow.TotalSteps = len(flowList) //流程总长度
|
|
|
|
|
runFlow.Uuid = runFlowInfo.Id
|
|
|
|
|
runFlow.RunUid = runUuId
|
|
|
|
|
runFlow.GainRunNode(startUs, 2, "重新发起流程")
|
|
|
|
|
flowJsonCont, _ := json.Marshal(runFlow.FlowList) //将步进流转化成json流
|
|
|
|
|
SaveFlowCont := publicmethod.MapOut[string]()
|
|
|
|
|
SaveFlowCont["`flow_cont`"] = string(flowJsonCont)
|
|
|
|
|
SaveFlowCont["`current_step`"] = runFlow.Step
|
|
|
|
|
SaveFlowCont["`next_step`"] = runFlow.NextStep
|
|
|
|
|
SaveFlowCont["`runKey`"] = runUuId
|
|
|
|
|
//参与人去重
|
|
|
|
|
var parUser []string
|
|
|
|
|
for _, v := range runFlow.Participant {
|
|
|
|
|
if !publicmethod.IsInTrue[string](v, parUser) {
|
|
|
|
|
parUser = append(parUser, v)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
SaveFlowCont["`participants`"] = strings.Join(parUser, ",")
|
|
|
|
|
nextRunUser := runFlow.NextRunNodeUser(1)
|
|
|
|
|
SaveFlowCont["`next_executor`"] = strings.Join(nextRunUser, ",")
|
|
|
|
|
SaveFlowCont["`status`"] = 3
|
|
|
|
|
if runFlow.NextStep <= 0 {
|
|
|
|
|
SaveFlowCont["`status`"] = 4
|
|
|
|
|
}
|
|
|
|
|
SaveFlowCont["`update_time`"] = time.Now().Unix()
|
|
|
|
|
err = runFlowInfo.EiteCont(map[string]interface{}{"`id`": runFlowInfo.Id}, SaveFlowCont)
|
|
|
|
|
if err != nil {
|
|
|
|
|
publicmethod.Result(106, err, c)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
var taskInfo customerForm.TaskRecord
|
|
|
|
|
saveTask := publicmethod.MapOut[string]()
|
|
|
|
|
saveTask["`status`"] = 3
|
|
|
|
|
saveTask["`edit_time`"] = time.Now().Unix()
|
|
|
|
|
taskInfo.EiteCont(map[string]interface{}{"`runFlowId`": requestData.Id}, saveTask)
|
|
|
|
|
publicmethod.Result(0, runFlowInfo, c)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*
|
|
|
|
|
@ 作者: 秦东
|
|
|
|
|
@ 时间: 2024-04-11 11:42:29
|
|
|
|
|
@ 功能: 申请修改数据
|
|
|
|
|
@ 参数
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
@ 返回值
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
@ 方法原型
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
*/
|
|
|
|
|
func (a *ApiMethod) ApplyForTableFormData(c *gin.Context) {
|
|
|
|
|
data, err := c.GetRawData() //接收表单提交得数据
|
|
|
|
|
if err != nil {
|
|
|
|
|
publicmethod.Result(100, err, c)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
mapData := publicmethod.MapOut[string]() //初始化MAP
|
|
|
|
|
err = json.Unmarshal(data, &mapData) //将json字符串转换成Map
|
|
|
|
|
if err != nil {
|
|
|
|
|
publicmethod.Result(100, err, c)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
masterKey := ""
|
|
|
|
|
if masterVal, ok := mapData["masters_key"]; !ok {
|
|
|
|
|
publicmethod.Result(1, err, c, "非法表单!不能提交数据!")
|
|
|
|
|
return
|
|
|
|
|
} else {
|
|
|
|
|
if masterValStr, ok := masterVal.(string); ok {
|
|
|
|
|
masterKey = masterValStr
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
var taskInfo customerForm.TaskRecord
|
|
|
|
|
err = taskInfo.GetCont(map[string]interface{}{"`masters_key`": mapData["masters_key"]})
|
|
|
|
|
if err != nil {
|
|
|
|
|
publicmethod.Result(1, err, c, "未知任务!不可修改!")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if taskInfo.Types == 1 {
|
|
|
|
|
switch taskInfo.Status {
|
|
|
|
|
case 3:
|
|
|
|
|
publicmethod.Result(1, err, c, "任务审批中不可执行修改审批")
|
|
|
|
|
return
|
|
|
|
|
default:
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//获取指定版本表单内容
|
|
|
|
|
var tableVersion modelAppPlatform.CustomerFormVersion
|
|
|
|
|
err = tableVersion.GetCont(map[string]interface{}{"`id`": taskInfo.VersionId})
|
|
|
|
|
if err != nil {
|
|
|
|
|
publicmethod.Result(107, err, c)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
// var formJsonCont customerform.CustomerFormMaster
|
|
|
|
|
// json.Unmarshal([]byte(taskInfo.MastesFormJson), &formJsonCont)
|
|
|
|
|
// var tableUnitList customerform.TableFormUnit
|
|
|
|
|
// tableUnitList.AnalysisTableFormUnitAttribute("", formJsonCont.List)
|
|
|
|
|
|
|
|
|
|
var sunFormName []string
|
|
|
|
|
if tableVersion.TableStructure != "" { //拆解获取子表名称
|
|
|
|
|
var sunFormStruct map[string]string
|
|
|
|
|
err = json.Unmarshal([]byte(tableVersion.TableStructure), &sunFormStruct)
|
|
|
|
|
if err == nil {
|
|
|
|
|
for _, v := range sunFormStruct {
|
|
|
|
|
if !publicmethod.IsInTrue[string](v, sunFormName) {
|
|
|
|
|
sunFormName = append(sunFormName, v)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} //子表名称集合
|
|
|
|
|
masterField := publicmethod.MapOut[string]() //主表数据
|
|
|
|
|
sunFieldAry := publicmethod.MapOut[string]() //子表数据
|
|
|
|
|
for k, v := range mapData {
|
|
|
|
|
if !publicmethod.IsInTrue[string](k, sunFormName) {
|
|
|
|
|
switch valAry := v.(type) {
|
|
|
|
|
case []interface{}:
|
|
|
|
|
if len(valAry) > 0 {
|
|
|
|
|
valStrJson, _ := json.Marshal(valAry)
|
|
|
|
|
masterField[k] = string(valStrJson)
|
|
|
|
|
} else {
|
|
|
|
|
masterField[k] = ""
|
|
|
|
|
}
|
|
|
|
|
default:
|
|
|
|
|
masterField[k] = v
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
sunFieldAry[k] = v
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//获取当前操作人信息
|
|
|
|
|
context, _ := c.Get(overall.MyContJwt)
|
|
|
|
|
var userCont modelshr.ManCont
|
|
|
|
|
userCont.GetLoginCont(context) //当前操作人
|
|
|
|
|
cureeTime := time.Now().Unix()
|
|
|
|
|
|
|
|
|
|
masterOldData, err := MasterTableHandle(tableVersion.TableKey, userCont.Key, cureeTime, masterField)
|
|
|
|
|
if err != nil {
|
|
|
|
|
publicmethod.Result(106, err, c)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//自定义表单修改数据历史记录
|
|
|
|
|
var tableEditLog reviseform.EditFormDataLog
|
|
|
|
|
masterKeyInt, _ := strconv.ParseInt(masterKey, 10, 64)
|
|
|
|
|
tableEditLog.MastersKey = masterKeyInt
|
|
|
|
|
tableEditLog.SourceForm = taskInfo.VersionId //来源表单版本
|
|
|
|
|
if len(sunFormName) > 0 {
|
|
|
|
|
sonList, err := SonTableHandle(masterKey, userCont.Key, cureeTime, sunFieldAry)
|
|
|
|
|
// fmt.Printf("sonList--->%v\n", sonList)
|
|
|
|
|
if err == nil {
|
|
|
|
|
sunTableList, _ := json.Marshal(sonList)
|
|
|
|
|
tableEditLog.SunDataCont = string(sunTableList) //子表数值
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
runUuId := publicmethod.GetUUid(6)
|
|
|
|
|
//启动流程
|
|
|
|
|
var flowInfo customerForm.RunWorkflow
|
|
|
|
|
flowInfo.GetCont(map[string]interface{}{"`flow_key`": mapData["masters_key"]})
|
|
|
|
|
//是否为流程表单
|
|
|
|
|
if taskInfo.Types == 1 {
|
|
|
|
|
tableEditLog.FlowKey = flowInfo.FlowKey //流程标识符"`
|
|
|
|
|
tableEditLog.RunKey = runUuId //当前执行识别符"`
|
|
|
|
|
}
|
|
|
|
|
masterTableOldJson, _ := json.Marshal(masterOldData)
|
|
|
|
|
tableEditLog.DataCont = string(masterTableOldJson) //主表数据值
|
|
|
|
|
tableEditLog.AddTime = cureeTime //创建时间"`
|
|
|
|
|
tableEditLog.State = 1 //状态(1、新数据;2:已批准的老数据)"`
|
|
|
|
|
if expval, isOk := mapData["explicate"].(string); isOk {
|
|
|
|
|
tableEditLog.Explicate = expval //string 说明"`
|
|
|
|
|
}
|
|
|
|
|
tableEditLog.EditTime = cureeTime //创建时间"`
|
|
|
|
|
tableEditLog.Executor = userCont.Key //:执行人"`
|
|
|
|
|
err = overall.CONSTANT_DB_ReviseFormData.Model(&reviseform.EditFormDataLog{}).Create(&tableEditLog).Error
|
|
|
|
|
|
|
|
|
|
if err == nil {
|
|
|
|
|
startUs := strconv.FormatInt(userCont.Key, 10) //当前操作人
|
|
|
|
|
var flowList []RunFlow
|
|
|
|
|
json.Unmarshal([]byte(flowInfo.FlowCont), &flowList)
|
|
|
|
|
//执行流程
|
|
|
|
|
var runFlow RunWorkFlow
|
|
|
|
|
runFlow.Step = 0 //执行第几部
|
|
|
|
|
runFlow.FlowList = flowList
|
|
|
|
|
runFlow.Participant = append(runFlow.Participant, startUs)
|
|
|
|
|
runFlow.TotalSteps = len(flowList) //流程总长度
|
|
|
|
|
runFlow.Uuid = flowInfo.Id
|
|
|
|
|
runFlow.RunUid = runUuId
|
|
|
|
|
runFlow.GainRunNode(startUs, 2, "申请修改数据")
|
|
|
|
|
|
|
|
|
|
flowJsonCont, _ := json.Marshal(runFlow.FlowList) //将步进流转化成json流
|
|
|
|
|
SaveFlowCont := publicmethod.MapOut[string]()
|
|
|
|
|
SaveFlowCont["`flow_cont`"] = string(flowJsonCont)
|
|
|
|
|
SaveFlowCont["`current_step`"] = runFlow.Step
|
|
|
|
|
SaveFlowCont["`next_step`"] = runFlow.NextStep
|
|
|
|
|
SaveFlowCont["`runKey`"] = runUuId
|
|
|
|
|
//参与人去重
|
|
|
|
|
var parUser []string
|
|
|
|
|
for _, v := range runFlow.Participant {
|
|
|
|
|
if !publicmethod.IsInTrue[string](v, parUser) {
|
|
|
|
|
parUser = append(parUser, v)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
SaveFlowCont["`participants`"] = strings.Join(parUser, ",")
|
|
|
|
|
nextRunUser := runFlow.NextRunNodeUser(1)
|
|
|
|
|
SaveFlowCont["`next_executor`"] = strings.Join(nextRunUser, ",")
|
|
|
|
|
SaveFlowCont["`status`"] = 3
|
|
|
|
|
if runFlow.NextStep <= 0 {
|
|
|
|
|
SaveFlowCont["`status`"] = 4
|
|
|
|
|
}
|
|
|
|
|
SaveFlowCont["`update_time`"] = time.Now().Unix()
|
|
|
|
|
flowInfo.EiteCont(map[string]interface{}{"`flow_key`": flowInfo.FlowKey}, SaveFlowCont)
|
|
|
|
|
taskInfo.EiteCont(map[string]interface{}{"`masters_key`": flowInfo.FlowKey}, map[string]interface{}{"`status`": 3})
|
|
|
|
|
}
|
|
|
|
|
sendInfo := publicmethod.MapOut[string]()
|
|
|
|
|
sendInfo["masterField"] = masterField
|
|
|
|
|
sendInfo["sunFieldAry"] = sunFieldAry
|
|
|
|
|
sendInfo["cureeTime"] = cureeTime
|
|
|
|
|
sendInfo["masterKey"] = masterKey
|
|
|
|
|
sendInfo["MasterTableHandle"] = masterOldData
|
|
|
|
|
sendInfo["err"] = err
|
|
|
|
|
publicmethod.Result(0, sendInfo, c)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*
|
|
|
|
|
@ 作者: 秦东
|
|
|
|
|
@ 时间: 2024-04-11 13:33:39
|
|
|
|
|
@ 功能: 审批处理
|
|
|
|
|
@ 参数
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
@ 返回值
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
@ 方法原型
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
*/
|
|
|
|
|
func (a *ApiMethod) AuthorizeWorkflow(c *gin.Context) {
|
|
|
|
|
var requestData SubmitAppResults
|
|
|
|
|
err := c.ShouldBindJSON(&requestData)
|
|
|
|
|
if err != nil {
|
|
|
|
|
publicmethod.Result(100, err, c)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if requestData.Id == "" {
|
|
|
|
|
publicmethod.Result(100, err, c)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if requestData.AgreeOrRefuse == 0 {
|
|
|
|
|
requestData.AgreeOrRefuse = 2
|
|
|
|
|
}
|
|
|
|
|
where := publicmethod.MapOut[string]()
|
|
|
|
|
where["`id`"] = requestData.Id
|
|
|
|
|
var flowInfo customerForm.RunWorkflow
|
|
|
|
|
err = flowInfo.GetCont(where)
|
|
|
|
|
if err != nil {
|
|
|
|
|
publicmethod.Result(107, err, c)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if flowInfo.NextStep == 0 || flowInfo.Status != 3 {
|
|
|
|
|
publicmethod.Result(1, err, c, "此流程再不可审批状态!您的提交无效")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if len(requestData.FlowList) < 1 {
|
|
|
|
|
if flowInfo.FlowCont != "" {
|
|
|
|
|
err = json.Unmarshal([]byte(flowInfo.FlowCont), &requestData.FlowList)
|
|
|
|
|
if err != nil {
|
|
|
|
|
publicmethod.Result(1, err, c, "流程异常!您的提交无效")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
publicmethod.Result(1, err, c, "流程异常!您的提交无效")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
context, _ := c.Get(overall.MyContJwt)
|
|
|
|
|
var userCont modelshr.ManCont
|
|
|
|
|
userCont.GetLoginCont(context) //当前操作人
|
|
|
|
|
//执行流程
|
|
|
|
|
var runFlow RunWorkFlow
|
|
|
|
|
runFlow.Step = flowInfo.CurrentStep + 1 //执行第几部
|
|
|
|
|
runFlow.NextStep = flowInfo.NextStep
|
|
|
|
|
runFlow.TotalSteps = len(requestData.FlowList) //流程总长度
|
|
|
|
|
runFlow.Uuid = flowInfo.FlowKey
|
|
|
|
|
runFlow.RunUid = flowInfo.RunKey
|
|
|
|
|
runFlow.Participant = strings.Split(flowInfo.Participants, ",")
|
|
|
|
|
runFlow.FlowList = requestData.FlowList
|
|
|
|
|
runFlow.FlowStepRun(userCont.Key, requestData.AgreeOrRefuse, requestData.Suggest)
|
|
|
|
|
|
|
|
|
|
// publicmethod.Result(1, runFlow, c, runFlow.Msg)
|
|
|
|
|
// return
|
|
|
|
|
if runFlow.IsRun {
|
|
|
|
|
publicmethod.Result(1, err, c, runFlow.Msg)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
flowJsonContdfg, _ := json.Marshal(runFlow) //将步进流转化成json流
|
|
|
|
|
fmt.Printf("\n\n\n最终数据写入------------->%v\n\n\n", string(flowJsonContdfg))
|
|
|
|
|
|
|
|
|
|
flowJsonCont, _ := json.Marshal(runFlow.FlowList) //将步进流转化成json流
|
|
|
|
|
saveFlowInfo := publicmethod.MapOut[string]()
|
|
|
|
|
saveTaskInfo := publicmethod.MapOut[string]()
|
|
|
|
|
saveFlowInfo["`flow_cont`"] = flowJsonCont
|
|
|
|
|
saveFlowInfo["`current_step`"] = runFlow.Step
|
|
|
|
|
saveFlowInfo["`next_step`"] = runFlow.NextStep
|
|
|
|
|
if flowInfo.Participants != "" {
|
|
|
|
|
oldUser := strings.Split(flowInfo.Participants, ",")
|
|
|
|
|
runFlow.Participant = append(runFlow.Participant, oldUser...)
|
|
|
|
|
}
|
|
|
|
|
//参与人去重
|
|
|
|
|
var parUser []string
|
|
|
|
|
for _, v := range runFlow.Participant {
|
|
|
|
|
if !publicmethod.IsInTrue[string](v, parUser) {
|
|
|
|
|
parUser = append(parUser, v)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
saveFlowInfo["`participants`"] = strings.Join(parUser, ",")
|
|
|
|
|
|
|
|
|
|
var tsakInfos customerForm.TaskRecord
|
|
|
|
|
tsakInfos.GetCont(map[string]interface{}{"`runFlowId`": requestData.Id}, "`participant`")
|
|
|
|
|
if len(parUser) > 0 {
|
|
|
|
|
oldTaskUser := strings.Split(tsakInfos.Participant, ",")
|
|
|
|
|
for _, v := range parUser {
|
|
|
|
|
if !publicmethod.IsInTrue[string](v, oldTaskUser) {
|
|
|
|
|
oldTaskUser = append(oldTaskUser, v)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
saveTaskInfo["`participant`"] = strings.Join(parUser, ",")
|
|
|
|
|
}
|
|
|
|
|
//抄送人
|
|
|
|
|
if flowInfo.MakeCopy != "" {
|
|
|
|
|
oldCopyUser := strings.Split(flowInfo.MakeCopy, ",")
|
|
|
|
|
runFlow.MakeCopy = append(runFlow.MakeCopy, oldCopyUser...)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var copyMan []string
|
|
|
|
|
for _, v := range runFlow.MakeCopy {
|
|
|
|
|
if !publicmethod.IsInTrue[string](v, copyMan) {
|
|
|
|
|
copyMan = append(copyMan, v)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
saveFlowInfo["`makeCopy`"] = strings.Join(copyMan, ",")
|
|
|
|
|
//下一步执行人
|
|
|
|
|
nextRunUser := runFlow.NextRunNodeUser(requestData.AgreeOrRefuse)
|
|
|
|
|
saveFlowInfo["`next_executor`"] = strings.Join(nextRunUser, ",")
|
|
|
|
|
saveFlowInfo["`update_time`"] = time.Now().Unix()
|
|
|
|
|
if requestData.AgreeOrRefuse == 1 {
|
|
|
|
|
if runFlow.NextStep != 0 {
|
|
|
|
|
saveFlowInfo["`status`"] = 3
|
|
|
|
|
saveTaskInfo["`status`"] = 3
|
|
|
|
|
} else {
|
|
|
|
|
saveFlowInfo["`status`"] = 4
|
|
|
|
|
saveTaskInfo["`status`"] = 4
|
|
|
|
|
JudgeEditFlow(flowInfo.FlowKey)
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
saveFlowInfo["`runKey`"] = publicmethod.GetUUid(6)
|
|
|
|
|
if runFlow.Step != 1 {
|
|
|
|
|
saveFlowInfo["`status`"] = 3
|
|
|
|
|
} else {
|
|
|
|
|
saveFlowInfo["`status`"] = 2
|
|
|
|
|
saveTaskInfo["`status`"] = 1
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
saveTaskInfo["`edit_time`"] = time.Now().Unix()
|
|
|
|
|
gordb := overall.CONSTANT_DB_CustomerForm.Begin()
|
|
|
|
|
flowErr := gordb.Model(&customerForm.RunWorkflow{}).Where(where).Updates(saveFlowInfo).Error
|
|
|
|
|
taskErr := gordb.Model(&customerForm.TaskRecord{}).Where("`runFlowId` = ?", requestData.Id).Updates(saveTaskInfo).Error
|
|
|
|
|
if flowErr != nil || taskErr != nil {
|
|
|
|
|
gordb.Rollback()
|
|
|
|
|
publicmethod.Result(100, err, c, "数据提交失败!请重新提交!")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
gordb.Commit()
|
|
|
|
|
publicmethod.Result(0, err, c)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*
|
|
|
|
|
@ 作者: 秦东
|
|
|
|
|
@ 时间: 2024-04-11 13:48:40
|
|
|
|
|
@ 功能: 判断是不是修改流程
|
|
|
|
|
@ 参数
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
@ 返回值
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
@ 方法原型
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
*/
|
|
|
|
|
func JudgeEditFlow(flowKey int64) {
|
|
|
|
|
var logDataInfo reviseform.EditFormDataLog
|
|
|
|
|
err := logDataInfo.GetCont(map[string]interface{}{"`flow_key`": flowKey, "`state`": 1})
|
|
|
|
|
if err == nil {
|
|
|
|
|
oldCont := publicmethod.MapOut[string]()
|
|
|
|
|
//处理主表数据
|
|
|
|
|
if logDataInfo.DataCont != "" {
|
|
|
|
|
mastInfo := publicmethod.MapOut[string]()
|
|
|
|
|
json.Unmarshal([]byte(logDataInfo.DataCont), &mastInfo)
|
|
|
|
|
var oldMastInfoKey []string
|
|
|
|
|
for i, _ := range mastInfo {
|
|
|
|
|
if !publicmethod.IsInTrue[string](i, oldMastInfoKey) {
|
|
|
|
|
oldMastInfoKey = append(oldMastInfoKey, i)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//获取主表
|
|
|
|
|
var taskInfo customerForm.TaskRecord
|
|
|
|
|
err = taskInfo.GetCont(map[string]interface{}{"`masters_key`": flowKey}, "`version_id`")
|
|
|
|
|
if err == nil {
|
|
|
|
|
var cusFormVersion modelAppPlatform.CustomerFormView
|
|
|
|
|
err = cusFormVersion.GetCont(map[string]interface{}{"`id`": taskInfo.VersionId}, "`tablekey`")
|
|
|
|
|
if err == nil {
|
|
|
|
|
oldDataMast := publicmethod.MapOut[string]()
|
|
|
|
|
//获取原始数据
|
|
|
|
|
err = overall.CONSTANT_DB_CustomerForm.Table(cusFormVersion.TableKey).Where("`masters_key` = ?", flowKey).Find(&oldDataMast).Error
|
|
|
|
|
if err == nil {
|
|
|
|
|
for ol, ov := range oldDataMast {
|
|
|
|
|
for _, olv := range oldMastInfoKey {
|
|
|
|
|
if ol == olv {
|
|
|
|
|
oldCont[ol] = ov
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
overall.CONSTANT_DB_CustomerForm.Table(cusFormVersion.TableKey).Where("`masters_key` = ?", flowKey).Updates(mastInfo)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
sunOldData := publicmethod.MapOut[string]()
|
|
|
|
|
//处理子表数据
|
|
|
|
|
if logDataInfo.SunDataCont != "" {
|
|
|
|
|
sunTableInfo := publicmethod.MapOut[string]()
|
|
|
|
|
json.Unmarshal([]byte(logDataInfo.SunDataCont), &sunTableInfo)
|
|
|
|
|
for i, v := range sunTableInfo {
|
|
|
|
|
var newSunDataAyr []map[string]interface{} //子表新数据
|
|
|
|
|
if val, isOk := v.([]interface{}); isOk { //判断子表数据是不是数组
|
|
|
|
|
for _, sv := range val { //循环输出数组数据
|
|
|
|
|
if sval, isTrues := sv.(map[string]interface{}); isTrues { //判断值是不是视图
|
|
|
|
|
oldSunKey := publicmethod.MapOut[string]()
|
|
|
|
|
for svi, svv := range sval { //解析视图值
|
|
|
|
|
oldSunKey[svi] = svv
|
|
|
|
|
}
|
|
|
|
|
newSunDataAyr = append(newSunDataAyr, oldSunKey)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
var oldDataSun []map[string]interface{} //子表老数据
|
|
|
|
|
overall.CONSTANT_DB_CustomerForm.Table(i).Where("`masters_key` = ?", flowKey).Find(&oldDataSun)
|
|
|
|
|
sunOldData[i] = oldDataSun
|
|
|
|
|
var oldSunTableIdMAp []int64
|
|
|
|
|
for _, oldv := range oldDataSun {
|
|
|
|
|
|
|
|
|
|
if sunId, iskk := oldv["id"]; iskk {
|
|
|
|
|
if idInt, isKv := sunId.(uint64); isKv {
|
|
|
|
|
oldSunTableIdMAp = append(oldSunTableIdMAp, int64(idInt))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//一下是区分修改还新增或删除
|
|
|
|
|
var nooPerate []int64
|
|
|
|
|
if len(newSunDataAyr) > 0 {
|
|
|
|
|
for _, nv := range newSunDataAyr {
|
|
|
|
|
if sunId, iskk := nv["id"]; iskk {
|
|
|
|
|
if idInt, isKv := sunId.(uint64); isKv {
|
|
|
|
|
if !publicmethod.IsInTrue[int64](int64(idInt), oldSunTableIdMAp) {
|
|
|
|
|
nooPerate = append(nooPerate, int64(idInt))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
overall.CONSTANT_DB_CustomerForm.Table(i).Where("`id` = ?", sunId).Updates(nv)
|
|
|
|
|
} else {
|
|
|
|
|
overall.CONSTANT_DB_CustomerForm.Table(i).Create(&nv)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if len(nooPerate) > 0 {
|
|
|
|
|
delSql := fmt.Sprintf("DELETE FROM %v WHERE `id` IN %v", i, nooPerate)
|
|
|
|
|
overall.CONSTANT_DB_CustomerForm.Exec(delSql)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
saveDataLog := publicmethod.MapOut[string]()
|
|
|
|
|
mastJsonCont, _ := json.Marshal(oldCont)
|
|
|
|
|
saveDataLog["dataCont"] = string(mastJsonCont)
|
|
|
|
|
sunJsonCont, _ := json.Marshal(sunOldData)
|
|
|
|
|
// fmt.Printf("子表会写更新:%v\n", string(sunJsonCont))
|
|
|
|
|
saveDataLog["sunDataCont"] = string(sunJsonCont)
|
|
|
|
|
saveDataLog["`state`"] = 2
|
|
|
|
|
saveDataLog["`editTime`"] = time.Now().Unix()
|
|
|
|
|
var logFlow reviseform.EditFormDataLog
|
|
|
|
|
logFlow.EiteCont(map[string]interface{}{"`flow_key`": flowKey, "`state`": 1}, saveDataLog)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*
|
|
|
|
|
@ 作者: 秦东
|
|
|
|
|
@ 时间: 2024-04-11 13:38:58
|
|
|
|
|
@ 功能: 流程处理
|
|
|
|
|
@ 参数
|
|
|
|
|
|
|
|
|
|
#userKey 当前处理人
|
|
|
|
|
#AgreeToRefuse 1:同意,2:驳回
|
|
|
|
|
#Suggest 审批意见
|
|
|
|
|
|
|
|
|
|
@ 返回值
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
@ 方法原型
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
*/
|
|
|
|
|
func (r *RunWorkFlow) FlowStepRun(userKey int64, AgreeToRefuse int, Suggest string) {
|
|
|
|
|
if len(r.FlowList) < 1 {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
rJson, _ := json.Marshal(r)
|
|
|
|
|
fmt.Printf("\n\n流程处理----1------>rJson:%v\n\n----------%v---------->%v----------%v\n\n\n", string(rJson), userKey, AgreeToRefuse, Suggest)
|
|
|
|
|
|
|
|
|
|
userKeyStr := strconv.FormatInt(userKey, 10)
|
|
|
|
|
for i := 0; i < r.TotalSteps; i++ {
|
|
|
|
|
if r.FlowList[i].Step == r.Step {
|
|
|
|
|
//判断操作人是有操作权限或是否已经操作过
|
|
|
|
|
isRun, msgInfo := JudgeOperUser(userKey, r.RunUid, r.FlowList[i].Operator)
|
|
|
|
|
r.IsRun = isRun
|
|
|
|
|
r.Msg = msgInfo
|
|
|
|
|
fmt.Printf("判断操作人是有操作权限或是否已经操作过---------->isRun:%v----------msgInfo:%v---------->r.IsRun:%v----------r.Msg:%v\n\n\n", isRun, msgInfo, r.IsRun, r.Msg)
|
|
|
|
|
if isRun {
|
|
|
|
|
return
|
|
|
|
|
} else {
|
|
|
|
|
if AgreeToRefuse != 1 { //驳回操作
|
|
|
|
|
r.FlowList[i].Status = 3
|
|
|
|
|
operatorAry, nodeUser := FindOperator(userKeyStr, r.RunUid, 3, r.FlowList[i].Operator, Suggest)
|
|
|
|
|
r.FlowList[i].Operator = operatorAry
|
|
|
|
|
r.Participant = append(r.Participant, nodeUser...)
|
|
|
|
|
r.RejectNode(r.FlowList[i].GoBackNode)
|
|
|
|
|
return
|
|
|
|
|
} else { //同意操作
|
|
|
|
|
currentStep, nextStep := PaceStep(r.RunUid, r.Step, r.TotalSteps, r.FlowList[i])
|
|
|
|
|
|
|
|
|
|
fmt.Printf("同意操作---->%v---->%v---->%v\n", currentStep, nextStep, r.FlowList[i].Types)
|
|
|
|
|
|
|
|
|
|
r.FlowList[i].Status = 2
|
|
|
|
|
operatorAry, nodeUser := FindOperator(userKeyStr, r.RunUid, 2, r.FlowList[i].Operator, Suggest)
|
|
|
|
|
r.FlowList[i].Operator = operatorAry
|
|
|
|
|
r.Participant = append(r.Participant, nodeUser...)
|
|
|
|
|
|
|
|
|
|
fmt.Printf("要执行得动作---->%v---->%v---->%v\n", r.FlowList[i].Types)
|
|
|
|
|
|
|
|
|
|
switch r.FlowList[i].Types {
|
|
|
|
|
case 0:
|
|
|
|
|
r.Step = currentStep
|
|
|
|
|
r.NextStep = nextStep
|
|
|
|
|
FlowRunLog(r.Uuid, userKey, 2, r.FlowList[i].NodeKey, "发起流程", "")
|
|
|
|
|
if JudgeRunNode(currentStep, r.FlowList) {
|
|
|
|
|
r.FlowStepRun(userKey, AgreeToRefuse, Suggest)
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
case 1:
|
|
|
|
|
r.Step = currentStep
|
|
|
|
|
r.NextStep = nextStep
|
|
|
|
|
FlowRunLog(r.Uuid, userKey, 2, r.FlowList[i].NodeKey, Suggest, "")
|
|
|
|
|
if nextStep != 0 {
|
|
|
|
|
r.RunNodeHandle(userKey, AgreeToRefuse, Suggest)
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
case 2:
|
|
|
|
|
r.Step = currentStep
|
|
|
|
|
r.NextStep = nextStep
|
|
|
|
|
// fmt.Printf("执行曹总--0->%v->%v\n", r.Step, r.NextStep)
|
|
|
|
|
for _, op := range r.FlowList[i].Operator {
|
|
|
|
|
r.MakeCopy = append(r.MakeCopy, op.Id)
|
|
|
|
|
userkIntId, _ := strconv.ParseInt(op.Id, 10, 64)
|
|
|
|
|
title := fmt.Sprintf("向%v发送抄送数据", op.Name)
|
|
|
|
|
FlowRunLog(r.Uuid, userkIntId, AgreeToRefuse, r.FlowList[i].NodeKey, title, "")
|
|
|
|
|
}
|
|
|
|
|
if r.NextStep > 0 {
|
|
|
|
|
r.FlowStepRun(userKey, AgreeToRefuse, Suggest)
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
case 3:
|
|
|
|
|
r.Step = currentStep
|
|
|
|
|
r.NextStep = nextStep
|
|
|
|
|
FlowRunLog(r.Uuid, userKey, 2, r.FlowList[i].NodeKey, Suggest, "")
|
|
|
|
|
return
|
|
|
|
|
default:
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*
|
|
|
|
|
@ 作者: 秦东
|
|
|
|
|
@ 时间: 2024-04-11 13:43:32
|
|
|
|
|
@ 功能: 查询驳回到哪个点
|
|
|
|
|
@ 参数
|
|
|
|
|
|
|
|
|
|
#nodeKey 返回的节点
|
|
|
|
|
|
|
|
|
|
@ 返回值
|
|
|
|
|
|
|
|
|
|
#isNew 是否重新发起
|
|
|
|
|
|
|
|
|
|
@ 方法原型
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
*/
|
|
|
|
|
func (r *RunWorkFlow) RejectNode(nodeKey string) (isNew bool) {
|
|
|
|
|
if nodeKey == "beginnode" {
|
|
|
|
|
r.Step = 1
|
|
|
|
|
if r.TotalSteps >= 2 {
|
|
|
|
|
r.NextStep = 2
|
|
|
|
|
isNew = false
|
|
|
|
|
} else {
|
|
|
|
|
r.NextStep = 0
|
|
|
|
|
isNew = true
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
for _, v := range r.FlowList {
|
|
|
|
|
if nodeKey == v.NodeKey {
|
|
|
|
|
r.Step = v.Step
|
|
|
|
|
nextStep := v.Step + 1
|
|
|
|
|
if nextStep <= r.TotalSteps {
|
|
|
|
|
r.NextStep = nextStep
|
|
|
|
|
isNew = false
|
|
|
|
|
} else {
|
|
|
|
|
r.NextStep = 0
|
|
|
|
|
isNew = true
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*
|
|
|
|
|
@ 作者: 秦东
|
|
|
|
|
@ 时间: 2024-04-11 13:40:35
|
|
|
|
|
@ 功能: 判断操作人是否已经操作过,并写入操作记录
|
|
|
|
|
@ 参数
|
|
|
|
|
|
|
|
|
|
#userKey 当前操作人
|
|
|
|
|
#runId 执行码
|
|
|
|
|
#Operator 操作人
|
|
|
|
|
|
|
|
|
|
@ 返回值
|
|
|
|
|
|
|
|
|
|
#isTrue
|
|
|
|
|
|
|
|
|
|
@ 方法原型
|
|
|
|
|
|
|
|
|
|
#func JudgeOperUser(userKey, runId int64, Operator []OperatorList) (bool, string) {}
|
|
|
|
|
*/
|
|
|
|
|
func JudgeOperUser(userKey, runId int64, Operator []OperatorList) (bool, string) {
|
|
|
|
|
if len(Operator) < 1 {
|
|
|
|
|
return true, "您不是此节点操作人!请不要提交!450"
|
|
|
|
|
}
|
|
|
|
|
caoZuoQuanXian := true
|
|
|
|
|
for _, v := range Operator {
|
|
|
|
|
|
|
|
|
|
if v.Id == strconv.FormatInt(userKey, 10) {
|
|
|
|
|
js, _ := json.Marshal(v)
|
|
|
|
|
fmt.Printf("判断操作人是否已经操作过\n userKey:%v====runId:%v=========v.Id=>%v\n\n\n%v\n\n\n", userKey, runId, v.Id, string(js))
|
|
|
|
|
// caoZuoQuanXian = false
|
|
|
|
|
if len(v.LogList) > 0 {
|
|
|
|
|
for _, m := range v.LogList {
|
|
|
|
|
if m.UID == strconv.FormatInt(runId, 10) {
|
|
|
|
|
fmt.Printf("判断操作人\n\n\n userKey:%v====runId:%v=========v.Id=>%v\n\n\n%v\n\n\n", userKey, runId, m.UID, m)
|
|
|
|
|
caoZuoQuanXian = true
|
|
|
|
|
return true, "您已经操作过此节点!请不要重复提交!"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
caoZuoQuanXian = false
|
|
|
|
|
} else {
|
|
|
|
|
caoZuoQuanXian = false
|
|
|
|
|
}
|
|
|
|
|
jsLog, _ := json.Marshal(v.LogList)
|
|
|
|
|
fmt.Printf("是否已经操作过\n userKey:%v====runId:%v=========caoZuoQuanXian=>%v\n\n\n%v\n\n\n", userKey, runId, caoZuoQuanXian, string(jsLog))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fmt.Printf("是否已经操作过===========================>%v\n\n\n", caoZuoQuanXian)
|
|
|
|
|
|
|
|
|
|
if caoZuoQuanXian {
|
|
|
|
|
return true, "您不是此节点操作人!请不要提交!123"
|
|
|
|
|
}
|
|
|
|
|
fmt.Printf("是否已经操作过===========234234325================>%v\n\n\n", caoZuoQuanXian)
|
|
|
|
|
return false, ""
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*
|
|
|
|
|
@ 作者: 秦东
|
|
|
|
|
@ 时间: 2024-06-04 10:27:12
|
|
|
|
|
@ 功能: 获取执行流程
|
|
|
|
|
@ 参数
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
@ 返回值
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
@ 方法原型
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
*/
|
|
|
|
|
func (a *ApiMethod) GainRunFlowStart(c *gin.Context) {
|
|
|
|
|
var requestData publicmethod.PublicId
|
|
|
|
|
err := c.ShouldBindJSON(&requestData)
|
|
|
|
|
if err != nil {
|
|
|
|
|
publicmethod.Result(100, err, c)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if requestData.Id == "" {
|
|
|
|
|
publicmethod.Result(107, err, c)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
var flowPage modelAppPlatform.FlowVersion //获取当前启用的流程信息
|
|
|
|
|
err = flowPage.GetCont(map[string]interface{}{"`key`": requestData.Id, "`state`": 1})
|
|
|
|
|
var flowCont FlowMainBody //整体流程架构
|
|
|
|
|
var sendInfo SendFlowInfo //执行流程
|
|
|
|
|
|
|
|
|
|
if err != nil && flowPage.Content == "" {
|
|
|
|
|
publicmethod.Result(0, sendInfo, c)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
err = json.Unmarshal([]byte(flowPage.Content), &flowCont) //解析流程列表
|
|
|
|
|
if err != nil {
|
|
|
|
|
publicmethod.Result(0, sendInfo, c)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
// publicmethod.Result(0, flowCont, c)
|
|
|
|
|
// return
|
|
|
|
|
context, _ := c.Get(overall.MyContJwt)
|
|
|
|
|
var userCont modelshr.ManCont
|
|
|
|
|
userCont.GetLoginCont(context) //获取当前操作人
|
|
|
|
|
var judgeWhy []ConditionListInfo //判断条件
|
|
|
|
|
var ddd []NodelPeopleInfo
|
|
|
|
|
workFlowInfo := flowCont.NodeConfig.CircularParsing(1, userCont, userCont.AdminOrg, judgeWhy, ddd)
|
|
|
|
|
sendInfo.Step = 1
|
|
|
|
|
sendInfo.NodeKey, sendInfo.NextStep, sendInfo.FlowList = ReformFlow(1, workFlowInfo)
|
|
|
|
|
publicmethod.Result(0, sendInfo, c)
|
|
|
|
|
}
|