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