You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1158 lines
31 KiB
1158 lines
31 KiB
package taskflowing
|
|
|
|
import (
|
|
"appPlatform/api/version1/workWechat"
|
|
"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"
|
|
)
|
|
|
|
/*
|
|
*
|
|
@ 作者: 秦东
|
|
@ 时间: 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 (2,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("`status` IN (1,2,3,4) AND `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].FormVersionId = strconv.FormatInt(userList[i].VersionId, 10)
|
|
userList[i].IdStr = strconv.FormatInt(userList[i].Id, 10)
|
|
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, userList[i].NextStep, userList[i].Status)
|
|
if idTrue {
|
|
userList[i].CurrentNodeName = nodeCont.NodeName
|
|
}
|
|
}
|
|
if userList[i].MastesForm == "" || userList[i].MastesFormJson == "" {
|
|
userList[i].MastesForm, userList[i].MastesFormJson = GainTaskFormData(userList[i].FlowKey)
|
|
}
|
|
if userList[i].Status == 3 && userList[i].NextStep != 0 {
|
|
if userList[i].CurrentStep == 1 {
|
|
userList[i].IsRetract = true
|
|
}
|
|
}
|
|
}
|
|
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, nextStep, state int) (nodeInfo RunFlow, isOk bool) {
|
|
if flowStr == "" {
|
|
return
|
|
}
|
|
var flowAry []RunFlow
|
|
err := json.Unmarshal([]byte(flowStr), &flowAry)
|
|
if err != nil {
|
|
return
|
|
}
|
|
if nextStep == 0 {
|
|
step = len(flowAry)
|
|
} else {
|
|
switch state {
|
|
case 1:
|
|
step = 0
|
|
case 2:
|
|
if step != 1 {
|
|
step = step + 1
|
|
}
|
|
case 3:
|
|
step = step + 1
|
|
case 4:
|
|
step = len(flowAry)
|
|
default:
|
|
step = step + 1
|
|
}
|
|
}
|
|
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.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)
|
|
}
|
|
|
|
/*
|
|
*
|
|
@ 作者: 秦东
|
|
@ 时间: 2023-11-24 13:52:00
|
|
@ 功能: 检查当前人抄送是否查看
|
|
@ 参数
|
|
|
|
#uuid 流程唯一识别符
|
|
#endStep 当前步进值
|
|
#flowList 流程列表
|
|
#userCont 人员信息
|
|
|
|
@ 返回值
|
|
|
|
#flowMap 流程列表
|
|
|
|
@ 方法原型
|
|
|
|
#
|
|
*/
|
|
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)
|
|
}
|
|
// fmt.Printf("currepStep:%v---->endStep:%v\n", currepStep, endStep)
|
|
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
|
|
}
|
|
|
|
/*
|
|
*
|
|
@ 作者: 秦东
|
|
@ 时间: 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)
|
|
}
|
|
}
|
|
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
|
|
}
|
|
|
|
/*
|
|
*
|
|
@ 作者: 秦东
|
|
@ 时间: 2023-11-24 16:31:43
|
|
@ 功能: 处理非会签情况
|
|
@ 参数
|
|
|
|
#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
|
|
}
|
|
|
|
/*
|
|
*
|
|
@ 作者: 秦东
|
|
@ 时间: 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 = 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)
|
|
|
|
// fmt.Printf("执行流程--2->%v------>%v\n", runFlow.Step, runFlow.NextStep)
|
|
|
|
if runFlow.IsRun {
|
|
publicmethod.Result(1, err, c, runFlow.Msg)
|
|
return
|
|
}
|
|
|
|
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, ",")
|
|
//下一步执行人
|
|
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_AppPlatform.Begin()
|
|
flowErr := gordb.Model(&modelAppPlatform.RunFlow{}).Where(where).Updates(saveFlowInfo).Error
|
|
taskErr := gordb.Model(&modelAppPlatform.Task{}).Where("`masters_key` = ?", 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)
|
|
}
|
|
|
|
/*
|
|
*
|
|
@ 作者: 秦东
|
|
@ 时间: 2023-12-02 13:49:17
|
|
@ 功能: 判断是不是修改流程
|
|
@ 参数
|
|
|
|
#
|
|
|
|
@ 返回值
|
|
|
|
#
|
|
|
|
@ 方法原型
|
|
|
|
#
|
|
*/
|
|
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 modelAppPlatform.Task
|
|
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)
|
|
// fmt.Printf("主表更新:%v----->%v------%v\n", cusFormVersion.TableKey, mastInfo, oldCont)
|
|
}
|
|
}
|
|
}
|
|
sunOldData := publicmethod.MapOut[string]()
|
|
// var sunOldData map[string]interface{}
|
|
//处理子表数据
|
|
if logDataInfo.SunDataCont != "" {
|
|
sunTableInfo := publicmethod.MapOut[string]()
|
|
json.Unmarshal([]byte(logDataInfo.SunDataCont), &sunTableInfo)
|
|
|
|
// fmt.Printf("子表数据:%v\n", 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)
|
|
}
|
|
}
|
|
}
|
|
|
|
// fmt.Printf("子表---2---》:%T========》%v\n", newSunDataAyr, newSunDataAyr)
|
|
|
|
var oldDataSun []map[string]interface{} //子表老数据
|
|
// //获取原始数据
|
|
overall.CONSTANT_DB_CustomerForm.Table(i).Where("`masters_key` = ?", flowKey).Find(&oldDataSun)
|
|
// fmt.Printf("获取子表AAA数据:%v----->%v------%v\n", i, v, oldDataSun)
|
|
// fmt.Printf("子表更新:%v----->%v------%v\n", i, i, newSunDataAyr)
|
|
sunOldData[i] = oldDataSun
|
|
//一下步骤是获取老数据表中的数据
|
|
var oldSunTableIdMAp []int64
|
|
for _, oldv := range oldDataSun {
|
|
|
|
if sunId, iskk := oldv["id"]; iskk {
|
|
// fmt.Printf("子表---9---》:%T========》%v\n", sunId, sunId)
|
|
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)
|
|
}
|
|
// overall.CONSTANT_DB_CustomerForm.Table(i).Where("`masters_key` = ?", flowKey).Updates(v)
|
|
}
|
|
}
|
|
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)
|
|
}
|
|
|
|
}
|
|
|
|
/*
|
|
*
|
|
@ 作者: 秦东
|
|
@ 时间: 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)
|
|
|
|
for i := 0; i < r.TotalSteps; i++ {
|
|
|
|
if r.FlowList[i].Step == r.Step {
|
|
// fmt.Printf("节点审批人--11->%v------>%v------>%v\n", r.FlowList[i].Step, r.Step, userKeyStr)
|
|
//判断操作人是有操作权限或是否已经操作过
|
|
r.IsRun, r.Msg = JudgeOperUser(userKey, r.RunUid, r.FlowList[i].Operator)
|
|
// fmt.Printf("节点审批人--12->%v------>%v------>%v\n", r.IsRun, r.Msg, userKeyStr)
|
|
if r.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("节点审批人--0->%v------>%v->%v------>%v\n", r.Step, r.NextStep, currentStep, nextStep)
|
|
|
|
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("节点审批人--2->%v------>%v\n", r.Step, r.NextStep)
|
|
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)
|
|
}
|
|
// fmt.Printf("节点审批人--3->%v------>%v\n", r.Step, r.NextStep)
|
|
return
|
|
case 1:
|
|
r.Step = currentStep
|
|
r.NextStep = nextStep
|
|
FlowRunLog(r.Uuid, userKey, 2, r.FlowList[i].NodeKey, Suggest, "")
|
|
// fmt.Printf("节点审批人--4->%v------>%v\n", r.Step, r.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.FlowStepRun(userKey, AgreeToRefuse, Suggest)
|
|
}
|
|
return
|
|
// fmt.Printf("节点审批人--5->%v------>%v\n", r.Step, r.NextStep)
|
|
case 3:
|
|
r.Step = currentStep
|
|
r.NextStep = nextStep
|
|
FlowRunLog(r.Uuid, userKey, 2, r.FlowList[i].NodeKey, Suggest, "")
|
|
// fmt.Printf("节点审批人--6->%v------>%v\n", r.Step, r.NextStep)
|
|
return
|
|
default:
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// fmt.Printf("节点审批人--end->%v------>%v\n", currentStep, nextStep)
|
|
// 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:
|
|
// }
|
|
// }
|
|
// }
|
|
}
|
|
|
|
/*
|
|
*
|
|
@ 作者: 秦东
|
|
@ 时间: 2023-11-27 14:04:01
|
|
@ 功能: 删除工作流
|
|
@ 参数
|
|
|
|
#
|
|
|
|
@ 返回值
|
|
|
|
#
|
|
|
|
@ 方法原型
|
|
|
|
#
|
|
*/
|
|
func (a *ApiMethod) DelRunFlow(c *gin.Context) {
|
|
var requestData publicmethod.PublicStates
|
|
err := c.ShouldBindJSON(&requestData)
|
|
if err != nil {
|
|
publicmethod.Result(100, err, c)
|
|
return
|
|
}
|
|
if requestData.Id == "" {
|
|
publicmethod.Result(100, err, c)
|
|
return
|
|
}
|
|
if requestData.Status == 0 {
|
|
requestData.Status = 1
|
|
}
|
|
where := publicmethod.MapOut[string]()
|
|
where["`id`"] = requestData.Id
|
|
var runFlowInfo modelAppPlatform.RunFlow
|
|
err = runFlowInfo.GetCont(where, "`flow_key`", "`status`")
|
|
if err != nil {
|
|
publicmethod.Result(107, err, c)
|
|
return
|
|
}
|
|
if runFlowInfo.Status != 1 && runFlowInfo.Status != 2 {
|
|
publicmethod.Result(1, err, c, "此流程不能操作!")
|
|
return
|
|
}
|
|
saveRunFlow := publicmethod.MapOut[string]()
|
|
saveRunFlow["`status`"] = requestData.Status
|
|
saveRunFlow["`update_time`"] = time.Now().Unix()
|
|
|
|
saveTask := publicmethod.MapOut[string]()
|
|
if requestData.Status == 2 {
|
|
saveTask["`status`"] = 1
|
|
} else {
|
|
saveTask["`status`"] = requestData.Status
|
|
}
|
|
saveTask["`edit_time`"] = time.Now().Unix()
|
|
var saveRunFlowInfo modelAppPlatform.RunFlow
|
|
err = saveRunFlowInfo.EiteCont(where, saveRunFlow)
|
|
var saveTaskInfo modelAppPlatform.Task
|
|
saveTaskInfo.EiteCont(map[string]interface{}{"`masters_key`": runFlowInfo.FlowKey}, saveTask)
|
|
if err != nil {
|
|
publicmethod.Result(106, err, c)
|
|
return
|
|
}
|
|
publicmethod.Result(0, err, c)
|
|
}
|
|
|
|
/*
|
|
*
|
|
@ 作者: 秦东
|
|
@ 时间: 2023-11-27 14:33:51
|
|
@ 功能: 重新发起流程
|
|
@ 参数
|
|
|
|
#
|
|
|
|
@ 返回值
|
|
|
|
#
|
|
|
|
@ 方法原型
|
|
|
|
#
|
|
*/
|
|
func (a *ApiMethod) AfreshRunFlow(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
|
|
}
|
|
where := publicmethod.MapOut[string]()
|
|
where["`flow_key`"] = requestData.Id
|
|
var runFlowInfo modelAppPlatform.RunFlow
|
|
err = runFlowInfo.GetCont(where, "`id`", "`flow_cont`", "`current_step`", `next_step`, `participants`)
|
|
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(where, SaveFlowCont)
|
|
if err != nil {
|
|
publicmethod.Result(106, err, c)
|
|
return
|
|
}
|
|
var taskInfo modelAppPlatform.Task
|
|
saveTask := publicmethod.MapOut[string]()
|
|
saveTask["`status`"] = 3
|
|
saveTask["`edit_time`"] = time.Now().Unix()
|
|
taskInfo.EiteCont(map[string]interface{}{"`masters_key`": requestData.Id}, saveTask)
|
|
publicmethod.Result(0, err, c)
|
|
}
|
|
|
|
/*
|
|
*
|
|
@ 作者: 秦东
|
|
@ 时间: 2023-12-01 09:20:42
|
|
@ 功能: 撤回申请
|
|
@ 参数
|
|
|
|
#
|
|
|
|
@ 返回值
|
|
|
|
#
|
|
|
|
@ 方法原型
|
|
|
|
#
|
|
*/
|
|
func (a *ApiMethod) RetractRunFlow(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
|
|
}
|
|
where := publicmethod.MapOut[string]()
|
|
where["`flow_key`"] = requestData.Id
|
|
var runFlowInfo modelAppPlatform.RunFlow
|
|
err = runFlowInfo.GetCont(where, "`id`", "`next_executor`", "`current_step`", `next_step`, `participants`)
|
|
if err != nil {
|
|
publicmethod.Result(107, err, c)
|
|
return
|
|
}
|
|
curTime := time.Now().Unix()
|
|
saveFlowInfo := publicmethod.MapOut[string]()
|
|
saveTaskInfo := publicmethod.MapOut[string]()
|
|
saveFlowInfo["`status`"] = 1
|
|
saveTaskInfo["`status`"] = 1
|
|
saveFlowInfo["`update_time`"] = curTime
|
|
saveTaskInfo["`edit_time`"] = curTime
|
|
saveFlowInfo["`runKey`"] = publicmethod.GetUUid(6)
|
|
saveFlowInfo["`current_step`"] = 1
|
|
saveFlowInfo["`next_step`"] = 0
|
|
saveFlowInfo["`next_executor`"] = ""
|
|
if runFlowInfo.NextExecutor != "" && runFlowInfo.Participants != "" {
|
|
canYuRen := strings.Split(runFlowInfo.Participants, ",")
|
|
nextMan := strings.Split(runFlowInfo.NextExecutor, ",")
|
|
var nextCanYuRen []string
|
|
for _, v := range canYuRen {
|
|
if !publicmethod.IsInTrue[string](v, nextMan) {
|
|
nextCanYuRen = append(nextCanYuRen, v)
|
|
}
|
|
}
|
|
if len(nextCanYuRen) > 0 {
|
|
saveFlowInfo["`participants`"] = strings.Join(nextCanYuRen, ",")
|
|
}
|
|
}
|
|
var runEditFlowInfo modelAppPlatform.RunFlow
|
|
err = runEditFlowInfo.EiteCont(where, saveFlowInfo)
|
|
if err != nil {
|
|
publicmethod.Result(106, err, c)
|
|
return
|
|
}
|
|
var taskInfo modelAppPlatform.Task
|
|
taskInfo.EiteCont(map[string]interface{}{"`masters_key`": requestData.Id}, saveTaskInfo)
|
|
workWechat.RecallWorkWechatMsg("stzl", requestData.Id)
|
|
publicmethod.Result(0, err, c)
|
|
}
|
|
|