// ============================================================================
// This is auto-generated by gf cli tool only once. Fill this file as you wish.
// ============================================================================
package wf_flow_process
import (
"github.com/gogf/gf/container/garray"
"github.com/gogf/gf/database/gdb"
"github.com/gogf/gf/encoding/gjson"
"github.com/gogf/gf/errors/gerror"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/os/gtime"
"github.com/gogf/gf/text/gstr"
"github.com/gogf/gf/util/gconv"
)
type ProcessData struct {
Id int `json:"id"`
Mode string `json:"mode"`
Name string `json:"name"`
FlowId uint `json:"flow_id"`
ProcessName string `json:"process_name"`
ProcessTo string `json:"process_to"`
Style string `json:"style"`
Process *Entity `json:"process"`
}
//流程转出信息
type ProcessStepData struct {
PrevId int `json:"prev_id"`
Id int `json:"id"`
ProcessName string `json:"process_name"`
ProcessType string `json:"process_type"`
Condition []string `json:"condition"`
}
type SaveProcessReq struct {
Id int `p:"id" v:"required#流程ID不能为空"`
Left string `p:"left" v:"required#流程坐标left不能为空"`
Top string `p:"top" v:"required#流程坐标top不能为空"`
ProcessTo string `p:"process_to" `
}
type SaveProcessReqBatch struct {
Data []*SaveProcessReq `p:"data" v:"required#数据不能为空"`
}
type SaveAttrReq struct {
FlowId int `p:"flow_id" v:"required#工作流id不能为空"`
ProcessId int `p:"process_id" v:required#流程id不能为空`
ProcessName string `p:"process_name" v:required#流程名称不能为空`
StyleWidth string `p:"style_width"`
StyleHeight string `p:"style_height"`
ProcessType string `p:"process_type"`
WfAction string `p:"wf_action"`
IsSing string `p:"is_sing"`
IsBack string `p:"is_back"`
AutoPerson string `p:"auto_person"`
RangeUserIds string `p:"range_user_ids"`
RangeUserText string `p:"range_user_text"`
AutoSponsorIds string `p:"auto_sponsor_ids"`
AutoSponsorText string `p:"auto_sponsor_text"`
AutoRoleIds string `p:"auto_role_ids"`
AutoRoleText string `p:"auto_role_text"`
WorkText string `p:"work_text"`
WorkIds string `p:"work_ids"`
WfMode string `p:"wf_mode"`
ProcessInSet []ProcessInSetReq `p:"process_in_set"`
WorkSql string `p:"work_sql"`
WorkMsg string `p:"work_msg"`
ProcessCondition string `p:"process_condition"`
}
type ProcessInSetReq struct {
Id int `p:"id"`
Condition []string `p:"condition"`
}
//流程管理表字段信息
type FlowTableField struct {
FieldName string `json:"field_name"`
FieldText string `json:"field_text"`
}
type DeleteProcessReq struct {
ProcessId int `p:"process_id" v:"required#流程ID不能为空" json:"process_id"`
FlowId int `p:"flow_id" v:"required#工作流Id不能为空" json:"flow_id"`
}
//获取流程下所有步骤信息
func ProcessAll(flowId int64) (total int64, processData []*ProcessData, err error) {
var list []*Entity
list, err = Model.Where("flow_id", flowId).Where("is_del", 0).Order("id asc").FindAll()
if err != nil {
g.Log().Error(err)
err = gerror.New("获取流程数据失败")
return
}
processData = make([]*ProcessData, len(list))
for k, entity := range list {
total += 1
style := gjson.New(entity.Style)
model := `未设置`
name := `未设置`
var work map[string]string
if entity.AutoPerson == 3 {
model = "办理人员"
name = entity.RangeUserText
}
if entity.AutoPerson == 4 {
model = "办理人员"
name = entity.AutoSponsorText
}
if entity.AutoPerson == 5 {
model = "办理角色"
name = entity.AutoRoleText
}
if entity.AutoPerson == 6 {
work = map[string]string{
"1": "制单人员",
"2": "制单人员领导",
}
model = `事务处理`
name = work[entity.WorkIds]
}
nameAttr := ""
if entity.ProcessType == "is_one" {
nameAttr = `[开始]`
} else {
if entity.WfMode == 0 {
nameAttr = "[直线]"
} else if entity.WfMode == 1 {
nameAttr = `[转出]`
} else {
nameAttr = `[同步]`
}
}
heightUnit := "px"
if style.GetString("height") == "auto" {
heightUnit = ""
}
processData[k] = &ProcessData{
Id: entity.Id,
Mode: model,
Name: name,
FlowId: entity.FlowId,
ProcessName: nameAttr + entity.ProcessName,
ProcessTo: entity.ProcessTo,
Style: "width:" + style.GetString("width") + "px;height:" + style.GetString("height") +
heightUnit + ";line-height:30px;color:#0e76a8;left:" + gconv.String(entity.Setleft) + "px;top:" + gconv.String(entity.Settop) + "px;",
Process: entity,
}
}
return
}
//保存流程步骤
func ProcessAdd(flowId int64) error {
processList, err := Model.Order("id desc").FindAll("flow_id", flowId)
if err != nil {
g.Log().Error(err)
return gerror.New("获取流程数据失败")
}
processCount := len(processList)
processType := "is_step"
var processSetLeft uint = 100
var processSetTop uint = 100
if processCount == 0 {
processType = "is_one"
processSetLeft = 100
processSetTop = 100
} else {
//新建步骤显示在上一个步骤下方
processType = "is_step"
processSetLeft = processList[0].Setleft + 30
processSetTop = processList[0].Settop + 30
}
style := gjson.New(nil)
style.Set("width", "120")
style.Set("height", "auto")
style.Set("color", "#0e76a8")
entity := &Entity{
FlowId: gconv.Uint(flowId),
Setleft: processSetLeft,
Settop: processSetTop,
ProcessType: processType,
Style: style.MustToJsonString(),
AutoPerson: 4,
ProcessName: "步骤",
IsSing: 1,
IsBack: 1,
WfAction: "view",
}
_, err = Model.Save(entity)
if err != nil {
g.Log().Error(err)
return gerror.New("保存流程步骤失败")
}
return nil
}
//保存设计
func SaveProcess(req *SaveProcessReqBatch) error {
if req != nil && req.Data != nil {
tx, err := g.DB().Begin()
if err != nil {
g.Log().Error(err)
return gerror.New("保存失败")
}
entities := make([]*Entity, len(req.Data))
for k, rq := range req.Data {
entity, err := Model.FindOne(rq.Id)
if err != nil || entity == nil {
if err != nil {
g.Log().Error(err)
}
tx.Rollback()
return gerror.New("不存在的流程信息,请刷新重试。")
}
entity.Setleft = gconv.Uint(rq.Left)
entity.Settop = gconv.Uint(rq.Top)
entity.ProcessTo = rq.ProcessTo
entities[k] = entity
}
_, err = Model.TX(tx).Data(entities).Save()
if err != nil {
g.Log().Error(err)
tx.Rollback()
return gerror.New("保存数据失败")
}
tx.Commit()
}
return nil
}
//获取流程管理表字段信息
func GetFlowTableFields(dbPrefix, database, tableName string) (fields []*FlowTableField, err error) {
sql := "SELECT COLUMN_NAME as field_name,column_comment as field_text FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = ? " +
"AND table_schema = ? "
var result gdb.Result
result, err = g.DB().GetAll(sql, dbPrefix+tableName, database)
if err != nil {
g.Log().Error(err)
err = gerror.New("查询表字段数据失败")
}
result.Structs(&fields)
return
}
//删除流程节点
func ProcessDelete(req *DeleteProcessReq) error {
tx, err := g.DB().Begin()
if err != nil {
g.Log().Error(err)
return gerror.New("开启处理事务失败")
}
_, err = Model.TX(tx).Delete(g.Map{
Columns.Id: req.ProcessId,
Columns.FlowId: req.FlowId,
Columns.IsDel: 0,
})
if err != nil {
g.Log().Error(err)
tx.Rollback()
return gerror.New("删除失败")
}
list, err := Model.Where(Columns.FlowId, req.FlowId).Where(Columns.IsDel, 0).
Where("FIND_IN_SET(?,process_to)", gconv.String(req.ProcessId)).FindAll()
if err != nil {
g.Log().Error(err)
return gerror.New("获取节点连接失败")
}
if list != nil {
for _, value := range list {
s := gstr.Split(value.ProcessTo, ",")
arr := garray.NewStrArrayFrom(s)
key := arr.Search(gconv.String(req.ProcessId))
arr.Remove(key)
processTo := ""
if arr.Len() > 0 {
processTo = arr.Join(",")
}
value.Updatetime = gconv.Uint(gtime.Timestamp())
value.ProcessTo = processTo
_, err := Model.TX(tx).Save(value)
if err != nil {
g.Log().Error(err)
tx.Rollback()
return gerror.New("删除节点连线失败")
}
}
}
tx.Commit()
return nil
}
//通过ID获取流程步骤信息
func GetProcessInfoById(id uint) (entity *Entity, err error) {
entity, err = Model.FindOne(id)
if err != nil {
g.Log().Error(err)
err = gerror.New("查询流程信息失败")
}
return
}
//查询流程信息
func GetProcessesByMap(where g.Map) (entities []*Entity, err error) {
entities, err = Model.Where(where).FindAll()
if err != nil {
g.Log().Error(err)
err = gerror.New("查询流程信息失败")
}
return
}
//通过ids获取多条流程步骤信息
func GetProcessInfosByIds(ids []uint) (entities []*Entity, err error) {
entities, err = Model.Where("id in (?)", ids).FindAll()
if err != nil {
g.Log().Error(err)
err = gerror.New("查询流程信息失败")
}
return
}