15 changed files with 1426 additions and 31 deletions
@ -0,0 +1,128 @@ |
|||||
|
package taskflow |
||||
|
|
||||
|
import ( |
||||
|
"appPlatform/models/modelshr" |
||||
|
"appPlatform/overall" |
||||
|
"appPlatform/overall/publicmethod" |
||||
|
"strconv" |
||||
|
) |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2023-11-25 13:14:11 |
||||
|
@ 功能: 获取流程管理员人员 |
||||
|
@ 参数 |
||||
|
|
||||
|
#role 角色ID |
||||
|
|
||||
|
@ 返回值 |
||||
|
|
||||
|
# |
||||
|
|
||||
|
@ 方法原型 |
||||
|
|
||||
|
# |
||||
|
*/ |
||||
|
func GainFlowRoleUser(role int) (Operator []OperatorList, userKey []string) { |
||||
|
var userInfoAry []modelshr.ManCont |
||||
|
overall.CONSTANT_DB_HR.Model(&modelshr.ManCont{}).Select("`key`,`name`,`number`,`icon`,`icon_photo`,`wechat`,`work_wechat`,`admin_org`,`position`,`teamid`,`mobilephone`,`company`").Where("FIND_IN_SET(?,`role`) AND `emp_type` BETWEEN ? AND ?", role, 1, 10).Find(&userInfoAry) |
||||
|
if len(userInfoAry) > 0 { |
||||
|
for _, uv := range userInfoAry { |
||||
|
Operator = append(Operator, TransformPublicUs(uv)) |
||||
|
usKey := strconv.FormatInt(uv.Key, 10) |
||||
|
if !publicmethod.IsInTrue[string](usKey, userKey) { |
||||
|
userKey = append(userKey, usKey) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2023-11-25 13:29:04 |
||||
|
@ 功能: 判断操作人是否已经操作过,并写入操作记录 |
||||
|
@ 参数 |
||||
|
|
||||
|
#userKey 当前操作人 |
||||
|
#runId 执行码 |
||||
|
#Operator 操作人 |
||||
|
|
||||
|
@ 返回值 |
||||
|
|
||||
|
#isTrue |
||||
|
|
||||
|
@ 方法原型 |
||||
|
|
||||
|
#func JudgeOperUser(userKey, runId int64, Operator []OperatorList) (isTrue bool) |
||||
|
*/ |
||||
|
func JudgeOperUser(userKey, runId int64, Operator []OperatorList) (bool, string) { |
||||
|
if len(Operator) < 1 { |
||||
|
return true, "您不是此节点操作人!请不要提交!" |
||||
|
} |
||||
|
caoZuoQuanXian := true |
||||
|
for _, v := range Operator { |
||||
|
if v.Id == strconv.FormatInt(userKey, 10) { |
||||
|
caoZuoQuanXian = false |
||||
|
if len(v.LogList) > 0 { |
||||
|
for _, m := range v.LogList { |
||||
|
if m.UID == strconv.FormatInt(runId, 10) { |
||||
|
return true, "您已经操作过此节点!请不要重复提交!" |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
if caoZuoQuanXian { |
||||
|
return true, "您不是此节点操作人!请不要提交!" |
||||
|
} |
||||
|
return false, "" |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2023-11-25 13:50:28 |
||||
|
@ 功能: 查询驳回到哪个点 |
||||
|
@ 参数 |
||||
|
|
||||
|
#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 |
||||
|
} |
||||
@ -0,0 +1,654 @@ |
|||||
|
package taskflow |
||||
|
|
||||
|
import ( |
||||
|
"appPlatform/models/modelAppPlatform" |
||||
|
"appPlatform/models/modelshr" |
||||
|
"appPlatform/overall" |
||||
|
"appPlatform/overall/publicmethod" |
||||
|
"encoding/json" |
||||
|
"fmt" |
||||
|
"strconv" |
||||
|
"strings" |
||||
|
"time" |
||||
|
|
||||
|
"github.com/gin-gonic/gin" |
||||
|
) |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2023-11-23 11:23:50 |
||||
|
@ 功能: 流程任务 |
||||
|
@ 参数 |
||||
|
|
||||
|
# |
||||
|
|
||||
|
@ 返回值 |
||||
|
|
||||
|
# |
||||
|
|
||||
|
@ 方法原型 |
||||
|
|
||||
|
# |
||||
|
*/ |
||||
|
func (a *ApiMethod) TaskFlowList(c *gin.Context) { |
||||
|
var requestData QueryTaskFlow |
||||
|
err := c.ShouldBindJSON(&requestData) |
||||
|
if err != nil { |
||||
|
publicmethod.Result(100, err, c) |
||||
|
return |
||||
|
} |
||||
|
if requestData.Page == 0 { |
||||
|
requestData.Page = 1 |
||||
|
} |
||||
|
if requestData.PageSize == 0 { |
||||
|
requestData.PageSize = 10 |
||||
|
} |
||||
|
context, _ := c.Get(overall.MyContJwt) |
||||
|
var userCont modelshr.ManCont |
||||
|
userCont.GetLoginCont(context) //当前操作人
|
||||
|
|
||||
|
gormDb := overall.CONSTANT_DB_AppPlatform.Model(&modelAppPlatform.RunTaskFlow{}).Select("`id`") |
||||
|
switch requestData.Class { |
||||
|
case 2: //待办事宜
|
||||
|
gormDb = gormDb.Where("`status` = 3 AND FIND_IN_SET(?,`next_executor`)", userCont.Key) |
||||
|
case 3: //已办事宜
|
||||
|
gormDb = gormDb.Where("`status` IN (3,4) AND FIND_IN_SET(?,`participants`) AND NOT FIND_IN_SET(?,`next_executor`) AND `creater` <> ?", userCont.Key, userCont.Key, userCont.Key) |
||||
|
case 4: //草稿箱
|
||||
|
gormDb = gormDb.Where("`status` = 1 AND `creater` = ?", userCont.Key) |
||||
|
default: //我的请求
|
||||
|
gormDb = gormDb.Where("`creater` = ?", userCont.Key) |
||||
|
} |
||||
|
if requestData.Title != "" { |
||||
|
gormDb = gormDb.Where("`title` LIKE ?", "%"+requestData.Title+"%") |
||||
|
} |
||||
|
if requestData.State != 0 { |
||||
|
gormDb = gormDb.Where("`status` = ?", requestData.State) |
||||
|
} |
||||
|
//获取总数
|
||||
|
var total int64 |
||||
|
totalErr := gormDb.Count(&total).Error |
||||
|
if totalErr != nil { |
||||
|
total = 0 |
||||
|
} |
||||
|
var idAry []int64 |
||||
|
gormDb = publicmethod.PageTurningSettings(gormDb, requestData.Page, requestData.PageSize) |
||||
|
// err = gormDb.Order("`status` asc").Order("`start_time` desc").Find(&idAry).Error
|
||||
|
err = gormDb.Order("`start_time` desc").Find(&idAry).Error |
||||
|
var userList []SendTaskFlowInfo |
||||
|
if err != nil || len(idAry) < 1 { |
||||
|
publicmethod.ResultList(0, requestData.Page, requestData.PageSize, total, int64(len(userList)), userList, c) |
||||
|
return |
||||
|
} |
||||
|
overall.CONSTANT_DB_AppPlatform.Model(&modelAppPlatform.RunTaskFlow{}).Where("`id` IN ?", idAry).Order("`start_time` desc").Find(&userList) |
||||
|
for i := 0; i < len(userList); i++ { |
||||
|
userList[i].FlowKeys = strconv.FormatInt(userList[i].FlowKey, 10) |
||||
|
userList[i].CreaterInfo = GainSmaillUserInfo[int64](userList[i].Creater) |
||||
|
if userList[i].NextExecutor != "" { |
||||
|
nextAry := strings.Split(userList[i].NextExecutor, ",") |
||||
|
for _, v := range nextAry { |
||||
|
userList[i].CurrentNodeUser = append(userList[i].CurrentNodeUser, GainSmaillUserInfo[string](v)) |
||||
|
} |
||||
|
} |
||||
|
userList[i].StartDate = publicmethod.UnixTimeToDay(userList[i].StartTime, 27) |
||||
|
if userList[i].NextStep != 0 { |
||||
|
nodeCont, idTrue := GainCurreNode(userList[i].FlowCont, userList[i].CurrentStep) |
||||
|
if idTrue { |
||||
|
userList[i].CurrentNodeName = nodeCont.NodeName |
||||
|
} |
||||
|
} |
||||
|
if userList[i].MastesForm == "" || userList[i].MastesFormJson == "" { |
||||
|
userList[i].MastesForm, userList[i].MastesFormJson = GainTaskFormData(userList[i].FlowKey) |
||||
|
} |
||||
|
} |
||||
|
publicmethod.ResultList(0, requestData.Page, requestData.PageSize, total, int64(len(userList)), userList, c) |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2023-11-24 11:36:32 |
||||
|
@ 功能: 获取表单数据 |
||||
|
@ 参数 |
||||
|
|
||||
|
# |
||||
|
|
||||
|
@ 返回值 |
||||
|
|
||||
|
# |
||||
|
|
||||
|
@ 方法原型 |
||||
|
|
||||
|
# |
||||
|
*/ |
||||
|
func GainTaskFormData(taskId int64) (mastesform, mastesformjson string) { |
||||
|
if taskId > 0 { |
||||
|
var taskInfo modelAppPlatform.Task |
||||
|
err := taskInfo.GetCont(map[string]interface{}{"`masters_key`": taskId}, "`version_id`") |
||||
|
if err != nil { |
||||
|
return |
||||
|
} |
||||
|
var formVerInfo modelAppPlatform.CustomerFormVersion |
||||
|
err = formVerInfo.GetCont(map[string]interface{}{"`id`": taskInfo.VersionId}, "`mastesform`", "`mastesformjson`") |
||||
|
if err != nil { |
||||
|
return |
||||
|
} |
||||
|
mastesform = formVerInfo.MastesForm |
||||
|
mastesformjson = formVerInfo.MastesFormJson |
||||
|
taskInfo.EiteCont(map[string]interface{}{"`masters_key`": taskId}, map[string]interface{}{"`mastesform`": formVerInfo.MastesForm, "`mastesformjson`": formVerInfo.MastesFormJson}) |
||||
|
} |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2023-11-23 16:34:22 |
||||
|
@ 功能: 获取当前节点 |
||||
|
@ 参数 |
||||
|
|
||||
|
# |
||||
|
|
||||
|
@ 返回值 |
||||
|
|
||||
|
# |
||||
|
|
||||
|
@ 方法原型 |
||||
|
|
||||
|
# |
||||
|
*/ |
||||
|
func GainCurreNode(flowStr string, step int) (nodeInfo RunFlow, isOk bool) { |
||||
|
if flowStr == "" { |
||||
|
return |
||||
|
} |
||||
|
var flowAry []RunFlow |
||||
|
err := json.Unmarshal([]byte(flowStr), &flowAry) |
||||
|
if err != nil { |
||||
|
return |
||||
|
} |
||||
|
for _, v := range flowAry { |
||||
|
if v.Step == step { |
||||
|
nodeInfo = v |
||||
|
isOk = true |
||||
|
return |
||||
|
} |
||||
|
} |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2023-11-23 16:17:17 |
||||
|
@ 功能: 获取简短人员信息 |
||||
|
@ 参数 |
||||
|
|
||||
|
#userKey 操作人 |
||||
|
|
||||
|
@ 返回值 |
||||
|
|
||||
|
# |
||||
|
|
||||
|
@ 方法原型 |
||||
|
|
||||
|
# |
||||
|
*/ |
||||
|
func GainSmaillUserInfo[T publicmethod.GenericityVariable](userKey T) (createrInfo UserSmallInfo) { |
||||
|
var userInfo modelshr.ManCont |
||||
|
err := userInfo.GetCont(map[string]interface{}{"`key`": userKey}, "`id`", "`key`", "`name`", "`number`", "`icon`", "`icon_photo`", "`wechat`", "`work_wechat`") |
||||
|
if err != nil { |
||||
|
return |
||||
|
} |
||||
|
createrInfo.Id = userInfo.Id |
||||
|
createrInfo.Key = strconv.FormatInt(userInfo.Key, 10) |
||||
|
createrInfo.Name = userInfo.Name |
||||
|
createrInfo.Number = userInfo.Number |
||||
|
createrInfo.Icon = userInfo.Icon |
||||
|
if userInfo.IconPhpto != "" { |
||||
|
createrInfo.Icon = userInfo.IconPhpto |
||||
|
} |
||||
|
createrInfo.WeChat = userInfo.Wechat |
||||
|
if userInfo.WorkWechat != "" { |
||||
|
createrInfo.WeChat = userInfo.WorkWechat |
||||
|
} |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2023-11-24 13:35:00 |
||||
|
@ 功能: 获取正在执行得任务流程 |
||||
|
@ 参数 |
||||
|
|
||||
|
# |
||||
|
|
||||
|
@ 返回值 |
||||
|
|
||||
|
# |
||||
|
|
||||
|
@ 方法原型 |
||||
|
|
||||
|
# |
||||
|
*/ |
||||
|
func (a *ApiMethod) GainRunTaskFlow(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 modelAppPlatform.RunFlow |
||||
|
err = runFlowInfo.GetCont(map[string]interface{}{"`flow_key`": requestData.Id}) |
||||
|
if err != nil || runFlowInfo.FlowCont == "" { |
||||
|
publicmethod.Result(107, 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(107, err, c) |
||||
|
return |
||||
|
} |
||||
|
//判断是否需要回写流程记录
|
||||
|
flowAry, operational := CheckMakeCopy(runFlowInfo.FlowKey, runFlowInfo.CurrentStep, flowList, userCont) |
||||
|
sendMap := publicmethod.MapOut[string]() |
||||
|
sendMap["flowList"] = flowAry |
||||
|
sendMap["operational"] = operational |
||||
|
publicmethod.Result(0, sendMap, c) |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2023-11-24 13:52:00 |
||||
|
@ 功能: 检查当前人抄送是否查看 |
||||
|
@ 参数 |
||||
|
|
||||
|
#uuid 流程唯一识别符 |
||||
|
#endStep 当前步进值 |
||||
|
#flowList 流程列表 |
||||
|
#userCont 人员信息 |
||||
|
|
||||
|
@ 返回值 |
||||
|
|
||||
|
#flowMap 流程列表 |
||||
|
|
||||
|
@ 方法原型 |
||||
|
|
||||
|
# |
||||
|
*/ |
||||
|
func CheckMakeCopy(uuid int64, endStep int, flowList []RunFlow, userCont modelshr.ManCont) (flowMap []RunFlow, operational bool) { |
||||
|
if len(flowList) < 1 { |
||||
|
return |
||||
|
} |
||||
|
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(flowList[i].Operator, userCont) |
||||
|
case 3: |
||||
|
operational = NotSignJointly(flowList[i].Operator, userCont) |
||||
|
default: |
||||
|
for m := 0; m < len(flowList[i].Operator); m++ { |
||||
|
if flowList[i].Operator[m].Id == userKey { |
||||
|
operational = true |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
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 |
||||
|
} |
||||
|
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 |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
flowMap = flowList |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2023-11-24 16:46:33 |
||||
|
@ 功能: 依次审批 |
||||
|
@ 参数 |
||||
|
|
||||
|
# |
||||
|
|
||||
|
@ 返回值 |
||||
|
|
||||
|
# |
||||
|
|
||||
|
@ 方法原型 |
||||
|
|
||||
|
# |
||||
|
*/ |
||||
|
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) |
||||
|
} |
||||
|
} |
||||
|
endTrue := true |
||||
|
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 |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2023-11-24 16:31:43 |
||||
|
@ 功能: 处理非会签情况 |
||||
|
@ 参数 |
||||
|
|
||||
|
#Operator 节点操作人 |
||||
|
#userCont 当前操作人 |
||||
|
|
||||
|
@ 返回值 |
||||
|
|
||||
|
#bool //是否可以操作
|
||||
|
|
||||
|
@ 方法原型 |
||||
|
|
||||
|
# |
||||
|
*/ |
||||
|
func NotSignJointly(Operator []OperatorList, userCont modelshr.ManCont) bool { |
||||
|
if len(Operator) < 1 { |
||||
|
return false |
||||
|
} |
||||
|
userMap := make(map[string]int) |
||||
|
minVal := 0 |
||||
|
for _, v := range Operator { |
||||
|
userMap[v.Id] = len(v.LogList) |
||||
|
if minVal >= len(v.LogList) { |
||||
|
minVal = len(v.LogList) |
||||
|
} |
||||
|
} |
||||
|
userKey := strconv.FormatInt(userCont.Key, 10) |
||||
|
for i, m := range userMap { |
||||
|
if m == minVal && i == userKey { |
||||
|
return true |
||||
|
} |
||||
|
} |
||||
|
return false |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2023-11-25 08:52:13 |
||||
|
@ 功能: 提交审批结果 |
||||
|
@ 参数 |
||||
|
|
||||
|
# |
||||
|
|
||||
|
@ 返回值 |
||||
|
|
||||
|
# |
||||
|
|
||||
|
@ 方法原型 |
||||
|
|
||||
|
# |
||||
|
*/ |
||||
|
func (a *ApiMethod) SubmitApprovalResults(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["`flow_key`"] = requestData.Id |
||||
|
var flowInfo modelAppPlatform.RunFlow |
||||
|
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 != "" { |
||||
|
json.Unmarshal([]byte(flowInfo.FlowCont), &requestData.FlowList) |
||||
|
} else { |
||||
|
publicmethod.Result(1, err, c, "流程异常!您的提交无效") |
||||
|
return |
||||
|
} |
||||
|
} |
||||
|
context, _ := c.Get(overall.MyContJwt) |
||||
|
var userCont modelshr.ManCont |
||||
|
userCont.GetLoginCont(context) //当前操作人
|
||||
|
var runFlowCont RunWorkFlow |
||||
|
runFlowCont.Step = flowInfo.CurrentStep |
||||
|
runFlowCont.NextStep = flowInfo.NextStep |
||||
|
runFlowCont.TotalSteps = len(requestData.FlowList) |
||||
|
runFlowCont.Uuid = flowInfo.FlowKey |
||||
|
runFlowCont.RunUid = flowInfo.RunKey |
||||
|
runFlowCont.Participant = strings.Split(flowInfo.Participants, ",") |
||||
|
runFlowCont.FlowList = requestData.FlowList |
||||
|
|
||||
|
//执行流程
|
||||
|
var runFlow RunWorkFlow |
||||
|
runFlow.Step = 1 //执行第几部
|
||||
|
runFlow.FlowList = requestData.FlowList |
||||
|
runFlow.TotalSteps = len(requestData.FlowList) //流程总长度
|
||||
|
runFlow.Uuid = flowInfo.FlowKey |
||||
|
runFlow.RunUid = flowInfo.RunKey |
||||
|
runFlow.FlowStepRun(userCont.Key, requestData.AgreeOrRefuse, requestData.Suggest) |
||||
|
|
||||
|
flowJsonCont, _ := json.Marshal(runFlow.FlowList) //将步进流转化成json流
|
||||
|
|
||||
|
saveFlowInfo := publicmethod.MapOut[string]() |
||||
|
saveFlowInfo["`flow_cont`"] = flowJsonCont |
||||
|
|
||||
|
// var runFlowContent modelAppPlatform.RunFlow
|
||||
|
// var taskContent modelAppPlatform.Task
|
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2023-11-25 11:15:56 |
||||
|
@ 功能: 流程处理 |
||||
|
@ 参数 |
||||
|
|
||||
|
#userKey 当前处理人 |
||||
|
#AgreeToRefuse 1:同意,2:驳回 |
||||
|
#Suggest 审批意见 |
||||
|
|
||||
|
@ 返回值 |
||||
|
|
||||
|
# |
||||
|
|
||||
|
@ 方法原型 |
||||
|
|
||||
|
# |
||||
|
*/ |
||||
|
func (r *RunWorkFlow) FlowStepRun(userKey int64, AgreeToRefuse int, Suggest string) { |
||||
|
if len(r.FlowList) < 1 { |
||||
|
return |
||||
|
} |
||||
|
userKeyStr := strconv.FormatInt(userKey, 10) |
||||
|
currentStep, nextStep := PaceStep(2, r.TotalSteps) |
||||
|
for i := 0; i < r.TotalSteps; i++ { |
||||
|
if r.FlowList[i].Step == r.Step { |
||||
|
//判断操作人是有操作权限或是否已经操作过
|
||||
|
r.IsRun, r.Msg = JudgeOperUser(userKey, r.RunUid, r.FlowList[i].Operator) |
||||
|
if r.IsRun { |
||||
|
return |
||||
|
} else { |
||||
|
|
||||
|
if AgreeToRefuse != 1 { //驳回操作
|
||||
|
r.FlowList[i].Status = 3 |
||||
|
operatorAry, nodeUser := FindOperator(userKeyStr, r.RunUid, 3, r.FlowList[i].Operator) |
||||
|
r.FlowList[i].Operator = operatorAry |
||||
|
r.Participant = append(r.Participant, nodeUser...) |
||||
|
r.RejectNode(r.FlowList[i].GoBackNode) |
||||
|
return |
||||
|
} else { //同意操作
|
||||
|
r.FlowList[i].Status = 2 |
||||
|
operatorAry, nodeUser := FindOperator(userKeyStr, r.RunUid, 2, r.FlowList[i].Operator) |
||||
|
r.FlowList[i].Operator = operatorAry |
||||
|
r.Participant = append(r.Participant, nodeUser...) |
||||
|
|
||||
|
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) |
||||
|
} |
||||
|
case 1: |
||||
|
r.Step = currentStep |
||||
|
r.NextStep = nextStep |
||||
|
FlowRunLog(r.Uuid, userKey, 2, r.FlowList[i].NodeKey, Suggest, "") |
||||
|
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 { |
||||
|
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) |
||||
|
} |
||||
|
case 3: |
||||
|
r.Step = currentStep |
||||
|
r.NextStep = nextStep |
||||
|
FlowRunLog(r.Uuid, userKey, 2, r.FlowList[i].NodeKey, Suggest, "") |
||||
|
default: |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
// for i := 0; i < r.TotalSteps; i++ {
|
||||
|
// if r.FlowList[i].Step == r.Step {
|
||||
|
// // operNum := len(r.Operator) //判断有多少审批人
|
||||
|
// switch len(r.FlowList[i].Operator) { //判断有多少审批人
|
||||
|
// case 0: //没有审批人时
|
||||
|
// if r.FlowList[i].NoHanderAction == 2 { //转交给管理员审批
|
||||
|
// caoZuoRen, canYuRen := GainFlowRoleUser(10)
|
||||
|
// r.FlowList[i].Operator = caoZuoRen
|
||||
|
// r.Participant = append(r.Participant, canYuRen...)
|
||||
|
// } else { //自动审批通过
|
||||
|
// r.Step = currentStep
|
||||
|
// r.NextStep = nextStep
|
||||
|
// FlowRunLog(r.Uuid, 0, AgreeToRefuse, r.FlowList[i].NodeKey, "自动审批通过", "")
|
||||
|
// if JudgeRunNode(currentStep, r.FlowList) {
|
||||
|
// r.GainRunNode(userKey, AgreeToRefuse)
|
||||
|
// }
|
||||
|
// }
|
||||
|
// case 1: //只有一个审批人时
|
||||
|
// default: //多人审批时
|
||||
|
// }
|
||||
|
|
||||
|
// switch r.FlowList[i].ExamineMode { //多人审批时采用的审批方式。0:无操作 1依次审批 2会签 3:非会签
|
||||
|
// case 1:
|
||||
|
// default:
|
||||
|
// }
|
||||
|
// }
|
||||
|
// }
|
||||
|
} |
||||
@ -0,0 +1,357 @@ |
|||||
|
package taskflow |
||||
|
|
||||
|
import ( |
||||
|
"appPlatform/models/flowlog" |
||||
|
"appPlatform/models/modelAppPlatform" |
||||
|
"appPlatform/models/modelshr" |
||||
|
"appPlatform/overall" |
||||
|
"appPlatform/overall/publicmethod" |
||||
|
"encoding/json" |
||||
|
"fmt" |
||||
|
"strconv" |
||||
|
"strings" |
||||
|
"time" |
||||
|
|
||||
|
"github.com/gin-gonic/gin" |
||||
|
) |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2023-11-22 16:13:21 |
||||
|
@ 功能: 发起工作流 |
||||
|
@ 参数 |
||||
|
|
||||
|
# |
||||
|
|
||||
|
@ 返回值 |
||||
|
|
||||
|
# |
||||
|
|
||||
|
@ 方法原型 |
||||
|
|
||||
|
# |
||||
|
*/ |
||||
|
func (a *ApiMethod) StartRunFlow(c *gin.Context) { |
||||
|
var requestData StartFlow |
||||
|
err := c.ShouldBindJSON(&requestData) |
||||
|
if err != nil { |
||||
|
publicmethod.Result(10001, err, c) |
||||
|
return |
||||
|
} |
||||
|
if requestData.Id == "" { |
||||
|
publicmethod.Result(10001, err, c, "未知进程!不可执行") |
||||
|
return |
||||
|
} |
||||
|
if len(requestData.FlowList) < 1 { |
||||
|
publicmethod.Result(10001, err, c, "未知进程!不可执行") |
||||
|
return |
||||
|
} |
||||
|
context, _ := c.Get(overall.MyContJwt) |
||||
|
var userCont modelshr.ManCont |
||||
|
userCont.GetLoginCont(context) //当前操作人
|
||||
|
creetTime := time.Now().Unix() //当前时间
|
||||
|
var taskInfo modelAppPlatform.Task |
||||
|
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`") |
||||
|
var runFlowInfo modelAppPlatform.RunFlow |
||||
|
uuid := publicmethod.GetUUid(1) |
||||
|
runUuId := publicmethod.GetUUid(6) |
||||
|
runFlowInfo.Id = uuid |
||||
|
runFlowInfo.FlowKey, _ = strconv.ParseInt(requestData.Id, 10, 64) //统一识别符
|
||||
|
// runFlowInfo.FlowKey = taskInfo.FlowKey //工作流主体
|
||||
|
runFlowInfo.Version = strconv.FormatInt(taskInfo.FlowRunSing, 10) //工作流版本
|
||||
|
runFlowInfo.VersionCont = flowVersionInfo.Content //当前工作流内容
|
||||
|
|
||||
|
runFlowInfo.Creater = userCont.Key //流程发起人
|
||||
|
runFlowInfo.Status = 3 //状态:1、草稿;2:驳回;3:审批中;4:归档;5:删除
|
||||
|
runFlowInfo.StartTime = creetTime //开始时间
|
||||
|
runFlowInfo.UpdateTime = creetTime //更新时间
|
||||
|
runFlowInfo.RunKey = runUuId //当前执行识别符
|
||||
|
|
||||
|
startUs := strconv.FormatInt(userCont.Key, 10) //当前操作人
|
||||
|
|
||||
|
//执行流程
|
||||
|
var runFlow RunWorkFlow |
||||
|
runFlow.Step = 1 //执行第几部
|
||||
|
runFlow.FlowList = requestData.FlowList |
||||
|
runFlow.Participant = append(runFlow.Participant, startUs) |
||||
|
runFlow.TotalSteps = len(requestData.FlowList) //流程总长度
|
||||
|
runFlow.Uuid = uuid |
||||
|
runFlow.RunUid = runUuId |
||||
|
runFlow.GainRunNode(startUs, 2) |
||||
|
|
||||
|
// fmt.Printf("执行完毕--10->%v->%v\n", runFlow.Step, runFlow.NextStep)
|
||||
|
|
||||
|
flowJsonCont, _ := json.Marshal(runFlow.FlowList) //将步进流转化成json流
|
||||
|
runFlowInfo.FlowCont = string(flowJsonCont) //流程执行体
|
||||
|
runFlowInfo.CurrentStep = runFlow.Step |
||||
|
runFlowInfo.NextStep = runFlow.NextStep |
||||
|
//参与人去重
|
||||
|
var parUser []string |
||||
|
for _, v := range runFlow.Participant { |
||||
|
if !publicmethod.IsInTrue[string](v, parUser) { |
||||
|
parUser = append(parUser, v) |
||||
|
} |
||||
|
} |
||||
|
runFlowInfo.Participants = strings.Join(parUser, ",") |
||||
|
nextRunUser := runFlow.NextRunNodeUser() |
||||
|
runFlowInfo.NextExecutor = strings.Join(nextRunUser, ",") |
||||
|
// xie, _ := json.Marshal(runFlowInfo)
|
||||
|
// fmt.Printf("写入数据--10->%v\n", string(xie))
|
||||
|
if runFlow.NextStep <= 0 { |
||||
|
runFlowInfo.Status = 4 |
||||
|
} |
||||
|
|
||||
|
err = runFlowInfo.WriteCont() |
||||
|
if err != nil { |
||||
|
publicmethod.Result(10001, err, c, "流程写入失败!请重新发起") |
||||
|
return |
||||
|
} |
||||
|
if runFlow.NextStep <= 0 { |
||||
|
var taskCont modelAppPlatform.Task |
||||
|
taskCont.EiteCont(map[string]interface{}{"`masters_key`": requestData.Id}, map[string]interface{}{"`status`": 4}) |
||||
|
} |
||||
|
publicmethod.Result(0, err, c) |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2023-11-23 10:05:43 |
||||
|
@ 功能: 流程执行记录 |
||||
|
@ 参数 |
||||
|
|
||||
|
#uuid 流程uuid |
||||
|
#userKey 操作人 |
||||
|
#AgreeToRefuse 同意或者驳回 |
||||
|
#nodeKey 操作得节点 |
||||
|
#idea 意见 |
||||
|
#annex 附件 |
||||
|
|
||||
|
@ 返回值 |
||||
|
|
||||
|
# |
||||
|
|
||||
|
@ 方法原型 |
||||
|
|
||||
|
# |
||||
|
*/ |
||||
|
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() |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2023-11-23 08:59:16 |
||||
|
@ 功能: 获取下一步执行人 |
||||
|
@ 参数 |
||||
|
|
||||
|
#userAry 下一步执行人 |
||||
|
|
||||
|
@ 返回值 |
||||
|
|
||||
|
# |
||||
|
|
||||
|
@ 方法原型 |
||||
|
|
||||
|
# |
||||
|
*/ |
||||
|
func (r *RunWorkFlow) NextRunNodeUser() (userAry []string) { |
||||
|
if r.NextStep <= 0 { |
||||
|
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 |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2023-11-22 16:57:06 |
||||
|
@ 功能: 执行工作流 |
||||
|
@ 参数 |
||||
|
|
||||
|
#userKey //当前执行人
|
||||
|
#AgreeToRefuse 同意或者驳回 |
||||
|
|
||||
|
@ 返回值 |
||||
|
|
||||
|
# |
||||
|
|
||||
|
@ 方法原型 |
||||
|
|
||||
|
# |
||||
|
*/ |
||||
|
func (r *RunWorkFlow) GainRunNode(userKey string, AgreeToRefuse int) { |
||||
|
userkInt, _ := strconv.ParseInt(userKey, 10, 64) |
||||
|
currentStep, nextStep := PaceStep(2, r.TotalSteps) |
||||
|
for i := 0; i < r.TotalSteps; i++ { |
||||
|
if r.FlowList[i].Step == r.Step { |
||||
|
operatorAry, nodeUser := FindOperator(userKey, r.RunUid, AgreeToRefuse, r.FlowList[i].Operator) |
||||
|
r.FlowList[i].Operator = operatorAry |
||||
|
r.FlowList[i].Status = AgreeToRefuse |
||||
|
r.Participant = append(r.Participant, nodeUser...) |
||||
|
switch r.FlowList[i].Types { |
||||
|
case 0: |
||||
|
r.Step = currentStep |
||||
|
r.NextStep = nextStep |
||||
|
FlowRunLog(r.Uuid, userkInt, AgreeToRefuse, r.FlowList[i].NodeKey, "发起流程", "") |
||||
|
if JudgeRunNode(currentStep, r.FlowList) { |
||||
|
r.GainRunNode(userKey, AgreeToRefuse) |
||||
|
} |
||||
|
return |
||||
|
case 1: |
||||
|
r.Step = currentStep |
||||
|
r.NextStep = nextStep |
||||
|
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 { |
||||
|
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) |
||||
|
} |
||||
|
return |
||||
|
case 3: |
||||
|
r.Step = currentStep |
||||
|
r.NextStep = nextStep |
||||
|
return |
||||
|
default: |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2023-11-23 08:46:38 |
||||
|
@ 功能: 判断当前节点是否要继续执行 |
||||
|
@ 参数 |
||||
|
|
||||
|
# |
||||
|
|
||||
|
@ 返回值 |
||||
|
|
||||
|
# |
||||
|
|
||||
|
@ 方法原型 |
||||
|
|
||||
|
# |
||||
|
*/ |
||||
|
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 |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2023-11-23 08:35:27 |
||||
|
@ 功能: 计算步伐 |
||||
|
@ 参数 |
||||
|
|
||||
|
# |
||||
|
|
||||
|
@ 返回值 |
||||
|
|
||||
|
# |
||||
|
|
||||
|
@ 方法原型 |
||||
|
|
||||
|
# |
||||
|
*/ |
||||
|
func PaceStep(step, totalSteps int) (currentStep, nextStep int) { |
||||
|
// fmt.Printf("计算步伐--1-->%v-->%v\n", step, totalSteps)
|
||||
|
if step >= totalSteps { |
||||
|
currentStep = totalSteps |
||||
|
nextStep = 0 |
||||
|
return |
||||
|
} |
||||
|
// fmt.Printf("计算步伐--2-->%v-->%v\n", currentStep, nextStep)
|
||||
|
currentStep = step |
||||
|
if currentStep >= totalSteps { |
||||
|
currentStep = totalSteps |
||||
|
nextStep = 0 |
||||
|
return |
||||
|
} |
||||
|
// fmt.Printf("计算步伐--3-->%v-->%v\n", currentStep, nextStep)
|
||||
|
nextStep = currentStep + 1 |
||||
|
if nextStep >= totalSteps { |
||||
|
nextStep = totalSteps |
||||
|
} |
||||
|
// fmt.Printf("计算步伐--4-->%v-->%v\n", currentStep, nextStep)
|
||||
|
return |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2023-11-23 08:21:52 |
||||
|
@ 功能: 比对操作人 |
||||
|
@ 参数 |
||||
|
|
||||
|
#userKey 操作人 |
||||
|
#runUid 执行Uid |
||||
|
#AgreeToRefuse 同意或者驳回 |
||||
|
#operator 当前节点操作人 |
||||
|
|
||||
|
@ 返回值 |
||||
|
|
||||
|
# |
||||
|
|
||||
|
@ 方法原型 |
||||
|
|
||||
|
# |
||||
|
*/ |
||||
|
func FindOperator(userKey string, runUid int64, AgreeToRefuse int, operator []OperatorList) (OperatorAry []OperatorList, nodeUser []string) { |
||||
|
// isOk := true
|
||||
|
var logCont LogList |
||||
|
logCont.State = AgreeToRefuse //状态 1、未操作;2、通过;3、驳回
|
||||
|
logCont.TimeVal = publicmethod.UnixTimeToDay(time.Now().Unix(), 1) |
||||
|
logCont.UID = strconv.FormatInt(runUid, 10) |
||||
|
for _, v := range operator { |
||||
|
nodeUser = append(nodeUser, v.Id) |
||||
|
if v.Id == userKey { |
||||
|
// isOk = false
|
||||
|
v.LogList = append(v.LogList, logCont) |
||||
|
} |
||||
|
OperatorAry = append(OperatorAry, v) |
||||
|
} |
||||
|
|
||||
|
return |
||||
|
} |
||||
@ -0,0 +1,78 @@ |
|||||
|
package modelAppPlatform |
||||
|
|
||||
|
import ( |
||||
|
"appPlatform/overall" |
||||
|
"strings" |
||||
|
) |
||||
|
|
||||
|
/* |
||||
|
* |
||||
|
@ 作者: 秦东 |
||||
|
@ 时间: 2023-11-23 11:08:11 |
||||
|
@ 功能: 工作流任务视图 |
||||
|
@ 参数 |
||||
|
|
||||
|
# |
||||
|
|
||||
|
@ 返回值 |
||||
|
|
||||
|
# |
||||
|
|
||||
|
@ 方法原型 |
||||
|
|
||||
|
# |
||||
|
*/ |
||||
|
type RunTaskFlow struct { |
||||
|
Id int64 `json:"id" gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null;comment:Id;index"` |
||||
|
FlowKey int64 `json:"flowKey" gorm:"column:flow_key;type:bigint(20) unsigned;default:0;not null;comment:工作流主体"` |
||||
|
Version string `json:"version" gorm:"column:version;type:varchar(255);default:'';comment:使用得版本"` |
||||
|
Status int `json:"status" gorm:"column:status;type:int(1) unsigned;default:1;not null;comment:状态:1、草稿;2:驳回;3:通过;4:归档;5:删除"` |
||||
|
FlowCont string `json:"flowcont" gorm:"column:flow_cont;type:longtext;comment:流程执行体"` |
||||
|
Creater int64 `json:"creater" gorm:"column:creater;type:bigint(20) unsigned;default:0;not null;comment:流程发起人"` |
||||
|
CurrentStep int `json:"currentStep" gorm:"column:current_step;type:int(4) unsigned;default:1;not null;comment:当前节点"` |
||||
|
NextStep int `json:"nextStep" gorm:"column:next_step;type:int(4) unsigned;default:0;not null;comment:下一个节点。0:代表没有下一个节点。流程结束"` |
||||
|
NextExecutor string `json:"nextExecutor" gorm:"column:next_executor;type:mediumtext;default:'';comment:下一步执行人"` |
||||
|
Participants string `json:"participants" gorm:"column:participants;type:longtext;comment:参与人"` |
||||
|
StartTime int64 `json:"startTime" gorm:"column:start_time;type:bigint(20) unsigned;default:0;not null;comment:创建时间"` |
||||
|
UpdateTime int64 `json:"update_time" gorm:"column:update_time;type:bigint(20) unsigned;default:0;not null;comment:编辑时间"` |
||||
|
VersionCont string `json:"versionCont" gorm:"column:version_cont;type:longtext;comment:版本流程内容"` |
||||
|
Title string `json:"title" gorm:"column:title;type:varchar(255) unsigned;default:'';not null;comment:标题"` |
||||
|
TableKey int64 `json:"table_key" gorm:"column:table_key;type:bigint(20) unsigned;default:0;not null;comment:主表标识"` |
||||
|
FlowRunSing int64 `json:"flowRunSing" gorm:"column:flow_run_sing;type:bigint(20) unsigned;default:0;not null;comment:主表标识"` |
||||
|
MastesForm string `json:"mastesform" gorm:"column:mastesform;type:longtext;default:'';comment:表单结构"` |
||||
|
MastesFormJson string `json:"mastesformjson" gorm:"column:mastesformjson;type:longtext;default:'';comment:表单结构json"` |
||||
|
RunKey int64 `json:"runKey" gorm:"column:runKey;type:bigint(20) unsigned;default:0;not null;comment:当前执行识别符"` |
||||
|
} |
||||
|
|
||||
|
func (RunTaskFlow *RunTaskFlow) TableName() string { |
||||
|
return "run_task_flow" |
||||
|
} |
||||
|
|
||||
|
// 获取内容
|
||||
|
func (cont *RunTaskFlow) GetCont(whereMap interface{}, field ...string) (err error) { |
||||
|
gormDb := overall.CONSTANT_DB_AppPlatform.Model(&cont) |
||||
|
if len(field) > 0 { |
||||
|
fieldStr := strings.Join(field, ",") |
||||
|
gormDb = gormDb.Select(fieldStr) |
||||
|
} |
||||
|
gormDb = gormDb.Where(whereMap) |
||||
|
err = gormDb.First(&cont).Error |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
// 根据条件获取总数
|
||||
|
func (cont *RunTaskFlow) CountCont(whereMap interface{}) (countId int64) { |
||||
|
overall.CONSTANT_DB_AppPlatform.Model(&cont).Where(whereMap).Count(&countId) |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
// 读取全部信息
|
||||
|
func (cont *RunTaskFlow) ContMap(whereMap interface{}, field ...string) (countAry []RunTaskFlow, err error) { |
||||
|
gormDb := overall.CONSTANT_DB_AppPlatform.Model(&cont) |
||||
|
if len(field) > 0 { |
||||
|
fieldStr := strings.Join(field, ",") |
||||
|
gormDb = gormDb.Select(fieldStr) |
||||
|
} |
||||
|
err = gormDb.Where(whereMap).Find(&countAry).Error |
||||
|
return |
||||
|
} |
||||
Loading…
Reference in new issue