package flowchart import ( "encoding/json" "fmt" "key_performance_indicators/api/workflow/currency_recipe" "key_performance_indicators/models/modelshr" "key_performance_indicators/models/modelskpi" "key_performance_indicators/overall" "key_performance_indicators/overall/publicmethod" "strconv" "strings" "time" "github.com/gin-gonic/gin" ) /* * @ 作者: 秦东 @ 时间: 2023-04-08 10:09:31 @ 功能: 获取审批记录 @ 参数 # @ 返回值 # @ 方法原型 # */ func (a *ApiMethod) GetApprovalRecord(c *gin.Context) { var receivedValue HaveApprovalRecord c.ShouldBindJSON(&receivedValue) if receivedValue.Page == 0 { receivedValue.Page = 1 } if receivedValue.PageSize == 0 { receivedValue.Page = 20 } //获取登录人信息 myLoginCont, _ := publicmethod.LoginMyCont(c) var flowList []modelskpi.ApprovalRecord gormDb := overall.CONSTANT_DB_KPI.Model(&modelskpi.ApprovalRecord{}) switch receivedValue.State { case 1: gormDb = gormDb.Where("ep_state = ? ", 1) case 2: gormDb = gormDb.Where("ep_state = ? ", 2) case 3: gormDb = gormDb.Where("ep_state = ? ", 3) case 4: gormDb = gormDb.Where("ep_state = ? ", 4) default: gormDb = gormDb.Where("ep_state BETWEEN ? AND ?", 1, 4) } if receivedValue.Title != "" { gormDb = gormDb.Where("target_title LIKE ? OR bylaws_title LIKE ?", "%"+receivedValue.Title+"%", "%"+receivedValue.Title+"%") } userIdentity := publicmethod.DetermineUserIdentity(myLoginCont.Key) switch userIdentity.Level { // case 1: // gormDb = gormDb.Where("FIND_IN_SET(?,`ep_participants`)", myLoginCont.Key) // case 2: // gormDb = gormDb.Where("`ep_setup_department` IN ? OR `ep_accept_department` IN ?", userIdentity.OrgList) // case 3: // gormDb = gormDb.Where("`ep_clique` = ? ", userIdentity.Group) // case 4: // gormDb = gormDb.Where("`ep_setup_department` IN ? OR `ep_accept_department` IN ?", userIdentity.OrgList) default: } var total int64 totalErr := gormDb.Count(&total).Error if totalErr != nil { total = 0 } gormDb = publicmethod.PageTurningSettings(gormDb, receivedValue.Page, receivedValue.PageSize) err := gormDb.Order("ep_id DESC").Find(&flowList).Error if err != nil { publicmethod.Result(105, err, c) return } var sendListCont []OutPutFlowLog for _, v := range flowList { var sendCont OutPutFlowLog sendCont.Id = strconv.FormatInt(v.Id, 10) // sendCont.OrderKey = strconv.FormatInt(v.OrderKey, 10) //发起表单key"` sendCont.Step = v.Step //当前执行到第几部"` sendCont.Content = v.Content //流程步进值"` sendCont.NextContent = v.NextContent //下一步内容"` sendCont.Time = v.Time //创建时间"` sendCont.CreationDate = publicmethod.UnixTimeToDay(v.StartTime, 11) sendCont.State = v.State //1:草稿,2:审批中;3:驳回;4:归档;5:删除"` sendCont.RoleGroup = strconv.FormatInt(v.RoleGroup, 10) //角色组"` sendCont.TypeClass = v.TypeClass //1、定性;2、定量"` sendCont.Participants = v.Participants //参与人"` sendCont.StartTime = v.StartTime //u流程开始时间"` sendCont.NextStep = v.NextStep //下一步"` sendCont.NextExecutor = v.NextExecutor //下一步执行人"` sendCont.SetupDepartment = strconv.FormatInt(v.SetupDepartment, 10) //发起部门"` sendCont.Dimension = v.Dimension //维度"` sendCont.Target = v.Target //指标"` sendCont.DetailedTarget = v.DetailedTarget //指标细则"` sendCont.AcceptDepartment = strconv.FormatInt(v.AcceptDepartment, 10) //接受考核部门"` sendCont.HappenTime = v.HappenTime //发生时间"` sendCont.FlowKey = strconv.FormatInt(v.FlowKey, 10) //工作流识别符"` sendCont.FlowVid = strconv.FormatInt(v.FlowVid, 10) //当前工作流版本号"` sendCont.EpOld = v.EpOld //1:旧流程;2:新流程"` sendCont.Creater = strconv.FormatInt(v.Creater, 10) //流程创始人"` sendCont.TargetTitle = v.TargetTitle //指标名称"` sendCont.BylawsTitle = v.BylawsTitle //细则名称"` sendCont.Clique = strconv.FormatInt(v.Clique, 10) //公司"` var accOrgCont modelshr.AdministrativeOrganization accOrgCont.GetCont(map[string]interface{}{"`id`": v.AcceptDepartment}, "`name`") sendCont.DepartmentName = accOrgCont.Name if v.Creater != 0 { var creaCont modelshr.PersonArchives creaCont.GetCont(map[string]interface{}{"`key`": v.Creater}, "`name`") sendCont.CreaterName = creaCont.Name } if v.EpOld == 2 { if v.NextContent != "" { var nextNode currency_recipe.NodeCont jsonErr := json.Unmarshal([]byte(v.NextContent), &nextNode) if jsonErr == nil { sendCont.CurrentNode = nextNode.NodeName if len(nextNode.UserList) > 0 { var userNameCree []string for _, uv := range nextNode.UserList { if !publicmethod.IsInTrue[string](uv.Name, userNameCree) { userNameCree = append(userNameCree, uv.Name) } } sendCont.CurrentNodeMan = strings.Join(userNameCree, ",") } } } } else { var flowLog []currency_recipe.NodeCont jsonFlowErr := json.Unmarshal([]byte(v.NextContent), &flowLog) // fmt.Printf("流程------>%v\n", flowLog) if jsonFlowErr == nil { for _, fv := range flowLog { if fv.Step == v.NextStep { sendCont.CurrentNode = fv.NodeName if len(fv.UserList) > 0 { var userNameCreeOld []string for _, uvo := range fv.UserList { if !publicmethod.IsInTrue[string](uvo.Name, userNameCreeOld) { userNameCreeOld = append(userNameCreeOld, uvo.Name) } } sendCont.CurrentNodeMan = strings.Join(userNameCreeOld, ",") } } } } } sendListCont = append(sendListCont, sendCont) } publicmethod.ResultList(0, receivedValue.Page, receivedValue.PageSize, int64(total), int64(len(sendListCont)), sendListCont, c) } /* * @ 作者: 秦东 @ 时间: 2023-04-08 16:47:22 @ 功能: 查看审批记录详情 @ 参数 # @ 返回值 # @ 方法原型 # */ func (a *ApiMethod) LookWorkFlowCont(c *gin.Context) { var receivedValue publicmethod.PublicId err := c.ShouldBindJSON(&receivedValue) if err != nil { publicmethod.Result(100, err, c) return } if receivedValue.Id == "" { publicmethod.Result(101, err, c) return } //获取流程信息 var evalProCont modelskpi.EvaluationProcess err = evalProCont.GetCont(map[string]interface{}{"ep_id": receivedValue.Id}) if err != nil { publicmethod.Result(107, err, c) return } var sendCont OutPutWorkflowCont sendCont.Id = strconv.FormatInt(evalProCont.Id, 10) sendCont.FlowNumber = strconv.FormatInt(evalProCont.OrderKey, 10) sendCont.Attribute = evalProCont.TypeClass //1、定性;2、定量"` if evalProCont.Creater != 0 { var creaCont modelshr.PersonArchives creaCont.GetCont(map[string]interface{}{"`key`": evalProCont.Creater}, "`name`") sendCont.CreaterName = creaCont.Name } var accOrgCont modelshr.AdministrativeOrganization accOrgCont.GetCont(map[string]interface{}{"`id`": evalProCont.AcceptDepartment}, "`name`") sendCont.DepartmentName = accOrgCont.Name sendCont.CreationDate = publicmethod.UnixTimeToDay(evalProCont.HappenTime, 11) sendCont.ReportingDate = publicmethod.UnixTimeToDay(evalProCont.Time, 11) sendCont.IsOld = evalProCont.EpOld if evalProCont.EpOld == 2 { json.Unmarshal([]byte(evalProCont.Content), &sendCont.WorkFlowList) if evalProCont.NextStep != 0 && evalProCont.NextStep <= len(sendCont.WorkFlowList) { sendCont.NodeStep = evalProCont.Step } else { sendCont.NodeStep = len(sendCont.WorkFlowList) } if evalProCont.State < 4 && evalProCont.NextContent != "" { var nextNodeCont currency_recipe.NodeCont json.Unmarshal([]byte(evalProCont.NextContent), &nextNodeCont) //获取登录人信息 myLoginCont, _ := publicmethod.LoginMyCont(c) if len(nextNodeCont.UserList) > 0 { for _, uv := range nextNodeCont.UserList { myKeyStr := strconv.FormatInt(myLoginCont.Key, 10) if uv.Id == myKeyStr { sendCont.Actionable = 1 } } } if len(sendCont.WorkFlowList) > 0 { for _, av := range sendCont.WorkFlowList { if av.CustomNode == nextNodeCont.NodeNumber { sendCont.OperateOtherNodes = av sendCont.SetExecutor = 1 } } } } } else { json.Unmarshal([]byte(evalProCont.NextContent), &sendCont.WorkFlowListOld) if evalProCont.NextStep != 0 && evalProCont.NextStep <= len(sendCont.WorkFlowListOld) { sendCont.NodeStep = evalProCont.Step } else { sendCont.NodeStep = len(sendCont.WorkFlowListOld) } } //定性部分 if evalProCont.TypeClass == 1 { var scoreFlowList []modelskpi.ScoreFlow overall.CONSTANT_DB_KPI.Model(&modelskpi.ScoreFlow{}).Select("sf_evaluation_plan,sf_plus_reduce_score,sf_score,sf_reason,sf_count,sf_target_id,sf_detailed_id").Where("sf_key = ?", evalProCont.OrderKey).Find(&scoreFlowList) if len(scoreFlowList) > 0 { for _, v := range scoreFlowList { var dingXingCong DingxingCont //获取指标信息 var targetCont modelskpi.EvaluationTarget targetCont.GetCont(map[string]interface{}{"`et_id`": v.TargetId}, "`et_title`", "`et_dimension`") dingXingCong.Target = targetCont.Title //获取维度细信息 var dimeCont modelskpi.DutyClass dimeCont.GetCont(map[string]interface{}{"`id`": targetCont.Dimension}, "`title`") dingXingCong.Dimension = dimeCont.Title //获取细则信息 var detailedTargetCont modelskpi.DetailedTarget detailedTargetCont.GetCont(map[string]interface{}{"`dt_id`": v.DetailedId}, "`dt_title`", "`dt_parentid_sun`") dingXingCong.DetailedTarget = detailedTargetCont.Title //获取栏目信息 var tableCont modelskpi.QualitativeTarget tableCont.GetCont(map[string]interface{}{"`q_id`": detailedTargetCont.ParentIdSun}, "`q_title`") dingXingCong.TableName = tableCont.Title //获取定性指标数据 var qualEvalView modelskpi.QualitativeEvaluationView qualEvalView.GetCont(map[string]interface{}{"`qe_id`": v.EvaluationPlan}, "`qe_min_score`", "`qe_max_score`", "`qe_reference_score`") if qualEvalView.MinScore > 0 && qualEvalView.MaxScore > 0 { dingXingCong.Standard = fmt.Sprintf("%v-%v", qualEvalView.MinScore/100, qualEvalView.MaxScore/100) //标准 defen := float64(v.Score) / 100 dingXingCong.PlusMinusScore = publicmethod.DecimalEs(defen, 2) } else if qualEvalView.MinScore > 0 && qualEvalView.MaxScore <= 0 { dingXingCong.Standard = fmt.Sprintf("%v", qualEvalView.MinScore/100) defen := (float64(v.Score) * float64(v.Count)) / 100 dingXingCong.PlusMinusScore = publicmethod.DecimalEs(defen, 2) } else if qualEvalView.MinScore <= 0 && qualEvalView.MaxScore > 0 { dingXingCong.Standard = fmt.Sprintf("%v", qualEvalView.MaxScore/100) defen := (float64(v.Score) * float64(v.Count)) / 100 dingXingCong.PlusMinusScore = publicmethod.DecimalEs(defen, 2) } else { dingXingCong.Standard = "0" defen := float64(v.Score) / 100 dingXingCong.PlusMinusScore = publicmethod.DecimalEs(defen, 2) } dingXingCong.Cause = v.Reason dingXingCong.PlusReduction = v.PlusReduceScore sendCont.DingXingList = append(sendCont.DingXingList, dingXingCong) } } } else { //定量 var flowLogCont modelskpi.FlowLog flcErr := flowLogCont.GetCont(map[string]interface{}{"`fl_key`": evalProCont.OrderKey}, "`fl_enclosure`", "`fl_planversion`", "`fl_baseline`") if flcErr == nil { var jiZhunZhi []DingLiangJizhuxian json.Unmarshal([]byte(flowLogCont.Baseline), &jiZhunZhi) var dingLiangLog []modelskpi.FlowLogData overall.CONSTANT_DB_KPI.Model(&modelskpi.FlowLogData{}).Select("fld_evaluation_id,fld_score,fld_cont,fld_scoring_method,fld_scoring_score,fld_target_id").Where("fld_flow_log = ?", evalProCont.OrderKey).Find(&dingLiangLog) if len(dingLiangLog) > 0 { for _, v := range dingLiangLog { var dingLiangInfo DingLiangCont //获取指标信息 var targetCont modelskpi.EvaluationTarget targetCont.GetCont(map[string]interface{}{"`et_id`": v.TargetId}, "`et_title`", "`et_dimension`") dingLiangInfo.Target = targetCont.Title //获取维度细信息 var dimeCont modelskpi.DutyClass dimeCont.GetCont(map[string]interface{}{"`id`": targetCont.Dimension}, "`title`") dingLiangInfo.Dimension = dimeCont.Title var zeroprize float64 var allprize float64 var capping float64 if len(jiZhunZhi) > 0 { for _, jzzv := range jiZhunZhi { epId := strconv.FormatInt(v.EvaluationPlan, 10) fmt.Printf("限定值---》%v\n", v.EvaluationPlan) if jzzv.Id == epId { dingLiangInfo.Zeroprize = publicmethod.DecimalEs(float64(jzzv.Zeroprize)/100, 2) //零奖值"` dingLiangInfo.Allprize = publicmethod.DecimalEs(float64(jzzv.Allprize)/100, 2) //零奖值"` dingLiangInfo.Capping = publicmethod.DecimalEs(float64(jzzv.Capping)/100, 2) //零奖值"` zeroprize = float64(jzzv.Zeroprize) allprize = float64(jzzv.Allprize) capping = float64(jzzv.Capping) } } } var qualEvalView modelskpi.QualitativeEvaluationView qualEvalView.GetCont(map[string]interface{}{"`qe_id`": v.EvaluationPlan}, "`qe_reference_score`") dingLiangInfo.Weight = float64(qualEvalView.ReferenceScore) //权重 dingLiangInfo.ActualValue = publicmethod.DecimalEs(float64(v.Score)/100, 2) //实际值 // dingLiangInfo.CompletionRate = v.Score //完成率 if v.ScoringMethod == 1 { dingLiangInfo.TargetScore, _, _, _, dingLiangInfo.CompletionRate = publicmethod.CalculateScore(qualEvalView.ReferenceScore, float64(v.Score), allprize, zeroprize, capping, 2) } else { dingLiangInfo.TargetScore = publicmethod.DecimalEs(float64(v.ScoringScore)/100, 2) //指标得分 } // dingLiangInfo.CalculationMethod = v.ScoringMethod dingLiangInfo.Cause = v.Content sendCont.DingLiangList = append(sendCont.DingLiangList, dingLiangInfo) } } } } publicmethod.Result(0, sendCont, c) } /* * @ 作者: 秦东 @ 时间: 2023-04-10 15:22:38 @ 功能: 审批操作 @ 参数 # @ 返回值 # @ 方法原型 # */ func (a *ApiMethod) ExamineAndApprove(c *gin.Context) { var receivedValue ExamAndApp c.ShouldBindJSON(&receivedValue) if receivedValue.Id == "" { publicmethod.Result(101, receivedValue, c) return } if receivedValue.YesOrNo == 0 { receivedValue.YesOrNo = 3 } //获取登录人信息 myLoginCont, err := publicmethod.LoginMyCont(c) if err != nil { publicmethod.Result(1, err, c, "你没有权限进行此操作!或您的身份令牌已超时!") return } //获取流程信息 var evalProCont modelskpi.EvaluationProcess err = evalProCont.GetCont(map[string]interface{}{"ep_id": receivedValue.Id}) if err != nil { publicmethod.Result(107, err, c) return } if evalProCont.State == 4 { publicmethod.Result(1, err, c, "流程已归档!不可进行审批!") return } if evalProCont.State == 5 { publicmethod.Result(1, err, c, "流程已锁定!不可进行任何操作!") return } if evalProCont.NextStep == 0 { publicmethod.Result(1, err, c, "流程已归档!不可进行审批!") return } if evalProCont.NextContent != "" { var nextNodeInfo currency_recipe.NodeCont jsonErr := json.Unmarshal([]byte(evalProCont.NextContent), &nextNodeInfo) if jsonErr == nil { isOk := false for _, v := range nextNodeInfo.UserList { myKeyStr := strconv.FormatInt(myLoginCont.Key, 10) if myKeyStr == v.Id { isOk = true } } if !isOk { publicmethod.Result(1, err, c, "你没有权限进行此操作!或您的身份令牌已超时!") return } } } var workFlowList []currency_recipe.NodeCont json.Unmarshal([]byte(evalProCont.Content), &workFlowList) var runWorkflow WorkFlowRuning runWorkflow.OrderKey = evalProCont.OrderKey runWorkflow.List = workFlowList runWorkflow.Step = evalProCont.NextStep runWorkflow.Executor = myLoginCont runWorkflow.YesOrNo = receivedValue.YesOrNo runWorkflow.Cause = receivedValue.Cause runWorkflow.Enclosure = receivedValue.Enclosure runWorkflow.ProcessOperation() editWorkflow := publicmethod.MapOut[string]() workflowAll, _ := json.Marshal(runWorkflow.List) editWorkflow["ep_cont"] = string(workflowAll) if len(runWorkflow.NextExecutor) > 0 { editWorkflow["ep_next_executor"] = strings.Join(runWorkflow.NextExecutor, ",") } else { editWorkflow["ep_next_executor"] = "" } if runWorkflow.NextNodeCont.Step != 0 { workflowNext, _ := json.Marshal(runWorkflow.NextNodeCont) editWorkflow["ep_next_cont"] = string(workflowNext) } else { editWorkflow["ep_next_cont"] = "" } editWorkflow["ep_next_step"] = runWorkflow.NextStep if len(runWorkflow.Participant) > 0 { editWorkflow["ep_participants"] = strings.Join(runWorkflow.Participant, ",") } else { editWorkflow["ep_participants"] = "" } if receivedValue.YesOrNo == 2 { if runWorkflow.NextStep == 0 { editWorkflow["ep_state"] = 4 } else { editWorkflow["ep_state"] = 2 } } else { editWorkflow["ep_state"] = receivedValue.YesOrNo } editWorkflow["ep_step"] = runWorkflow.Step editWorkflow["ep_time"] = time.Now().Unix() var evalProContEdit modelskpi.EvaluationProcess err = evalProContEdit.EiteCont(map[string]interface{}{"ep_id": evalProCont.Id}, editWorkflow) // uh := publicmethod.MapOut[string]() // uh["editWorkflow"] = editWorkflow // uh["runWorkflow"] = runWorkflow if err != nil { publicmethod.Result(104, err, c) return } publicmethod.Result(0, err, c) } /* * @ 作者: 秦东 @ 时间: 2023-04-10 16:52:14 @ 功能: 流程操作 @ 参数 # @ 返回值 # @ 方法原型 # */ func (w *WorkFlowRuning) ProcessOperation() { total := len(w.List) //获取流程总长度 if total > 0 { //流程存在内容 if w.Step <= total && w.Step != 0 { //判断流程起点及流程有无超出范围 w.NextStep = w.Step + 1 //获取下一步步进值 if w.NextStep >= total { w.NextStep = 0 } userKey := strconv.FormatInt(w.Executor.Key, 10) //当前操作人Key for i, v := range w.List { //遍历匹配节点 if v.Step < w.Step { //当前节点之前的节点全部置操作 w.List[i].State = 2 for _, usv := range v.UserList { //获取已参与进来的人 if !publicmethod.IsInTrue[string](usv.Id, w.Participant) { w.Participant = append(w.Participant, usv.Id) } } } if v.Step == w.Step { //当前节点 w.List[i].State = 2 //节点置已操作 var atPresentWechat []string var atPresent []string for ui, uv := range v.UserList { if !publicmethod.IsInTrue[string](uv.Id, w.Participant) { w.Participant = append(w.Participant, uv.Id) } atPresent = append(atPresent, uv.Id) atPresentWechat = append(atPresentWechat, uv.Wechat) if uv.Id == userKey { var userCarrLog currency_recipe.LogList userCarrLog.State = w.YesOrNo //状态 1、未操作;2、通过;3、驳回 userCarrLog.Cause = w.Cause userCarrLog.TimeVal = publicmethod.UnixTimeToDay(time.Now().Unix(), 1) userCarrLog.Enclosure = w.Enclosure //附件 w.List[i].UserList[ui].LogList = append(w.List[i].UserList[ui].LogList, userCarrLog) } } w.RunNode = v w.WriteFlowLog() if v.Type != 2 { //判断当前节点是不是操作 //不是抄送节点 //判断同意还是驳回 if w.YesOrNo == 2 { w.NodeYes(total) } else { w.NodeNot(total, v.GoBackNode) } } else { //是抄送节点 w.ProcessOperation() return } } } } else { //流程已结束 w.NextStep = 0 for i, v := range w.List { w.List[i].State = 2 for _, usv := range v.UserList { if !publicmethod.IsInTrue[string](usv.Id, w.Participant) { w.Participant = append(w.Participant, usv.Id) } } } } } } /* * @ 作者: 秦东 @ 时间: 2023-04-11 09:32:38 @ 功能: 判断下一步要执行什么(拒绝) @ 参数 #total 流程总步数 #nodeNumber 要退回的节点 @ 返回值 # @ 方法原型 # */ func (w *WorkFlowRuning) NodeNot(total int, nodeNumber string) { if total <= 1 { w.NextStep = 1 } for _, nv := range w.List { if nv.NodeNumber == nodeNumber { w.NextStep = nv.Step w.Step = nv.Step break } } w.NodeYes(total) } /* * @ 作者: 秦东 @ 时间: 2023-04-11 09:26:41 @ 功能: 判断下一步要执行什么(同意) @ 参数 #total 流程总步数 @ 返回值 # @ 方法原型 # */ func (w *WorkFlowRuning) NodeYes(total int) { if w.NextStep <= total && w.NextStep != 0 { for i, v := range w.List { if v.Step == w.NextStep { writeLog := false if v.Type == 2 { w.Step = w.NextStep writeLog = true w.List[i].State = 2 } var nextZhiXingRen []string var atPresentWechat []string for ni, nv := range v.UserList { if !publicmethod.IsInTrue[string](nv.Id, w.Participant) { w.Participant = append(w.Participant, nv.Id) } if !publicmethod.IsInTrue[string](nv.Id, nextZhiXingRen) { nextZhiXingRen = append(nextZhiXingRen, nv.Id) //下一步执行人 } if !publicmethod.IsInTrue[string](nv.Wechat, atPresentWechat) { atPresentWechat = append(atPresentWechat, nv.Wechat) } if writeLog { //参送节点直接发送信息 var userCarrLog currency_recipe.LogList userCarrLog.State = w.YesOrNo //状态 1、未操作;2、通过;3、驳回 userCarrLog.Cause = w.Cause userCarrLog.TimeVal = publicmethod.UnixTimeToDay(time.Now().Unix(), 1) userCarrLog.Enclosure = w.Enclosure //附件 w.List[i].UserList[ni].LogList = append(w.List[i].UserList[ni].LogList, userCarrLog) } } w.NextNodeCont = v w.NextExecutor = nextZhiXingRen if writeLog { w.RunNode = v w.WriteFlowLog() w.ProcessOperation() return } } } } } /* * @ 作者: 秦东 @ 时间: 2023-04-10 16:52:24 @ 功能: 审批记录新增 @ 参数 # @ 返回值 # @ 方法原型 # */ func (w *WorkFlowRuning) WriteFlowLog() { //审批记录 var stepsTotal int64 overall.CONSTANT_DB_KPI.Model(&modelskpi.OpenApprovalChangeLog{}).Where("`orderid` = ?", w.OrderKey).Count(&stepsTotal) var flowLogCont modelskpi.OpenApprovalChangeLog flowLogCont.Type = 1 //类型(1:部门;2:岗位)"` flowLogCont.Title = w.RunNode.NodeName //节点名称"` flowLogCont.Operator = w.Executor.Key //操作人"` flowLogCont.OrderId = w.OrderKey //订单ID"` flowLogCont.OperatorTime = time.Now().Unix() //操作时间"` flowLogCont.Step = stepsTotal + 1 //操作第几步"` flowLogCont.OperatorType = w.RunNode.State //操作状态(1:位操作;2:已操作)"` flowLogCont.Msgid = "" //消息id,用于撤回应用消息"` flowLogCont.ResponseCode = "" //仅消息类型为“按钮交互型”,“投票选择型”和“多项选择型”的模板卡片消息返回,应用可使用response_code调用更新模版卡片消息接口,24小时内有效,且只能使用一次"` flowLogCont.Stepper = w.RunNode.Step //步进器"` flowLogCont.ChangeIsTrue = 1 //是否可变更(1:可变更;2:不可变更)"` flowLogCont.Eiteyime = time.Now().Unix() //变动时间"` flowLogCont.YesOrNo = w.YesOrNo //未操作;1:同意;2:驳回;3:撤回"` flowLogCont.Idea = w.Cause fileJson, _ := json.Marshal(w.Executor) flowLogCont.Annex = string(fileJson) flowLogCont.AddCont() }