diff --git a/apis/process/process.go b/apis/process/process.go index 1a58f75..c58eb26 100644 --- a/apis/process/process.go +++ b/apis/process/process.go @@ -154,53 +154,51 @@ func ProcessDetails(c *gin.Context) { } // 分类流程列表 -//func ClassifyProcessList(c *gin.Context) { -// type classifyProcess struct { -// process2.Classify -// ProcessList []*process2.Info `json:"process_list"` -// } -// -// var ( -// err error -// classifyList []*classifyProcess -// ) -// -// processName := c.DefaultQuery("name", "") -// if processName == "" { -// err = connection.DB.Self.Model(&process2.Classify{}).Find(&classifyList).Error -// if err != nil { -// Response(c, code.SelectError, nil, fmt.Sprintf("获取分类列表失败,%v", err.Error())) -// return -// } -// } else { -// var classifyIdList []int -// err = connection.DB.Self.Model(&process2.Info{}). -// Where("name LIKE ?", fmt.Sprintf("%%%v%%", processName)). -// Pluck("distinct classify", &classifyIdList).Error -// if err != nil { -// Response(c, code.SelectError, nil, fmt.Sprintf("获取分类失败,%v", err.Error())) -// return -// } -// -// err = connection.DB.Self.Model(&process2.Classify{}). -// Where("id in (?)", classifyIdList). -// Find(&classifyList).Error -// if err != nil { -// Response(c, code.SelectError, nil, fmt.Sprintf("获取分类失败,%v", err.Error())) -// return -// } -// } -// -// for _, item := range classifyList { -// err = connection.DB.Self.Model(&process2.Info{}). -// Where("classify = ?", item.Id). -// Select("id, create_time, update_time, name"). -// Find(&item.ProcessList).Error -// if err != nil { -// Response(c, code.SelectError, nil, fmt.Sprintf("获取流程失败,%v", err.Error())) -// return -// } -// } -// -// Response(c, nil, classifyList, "") -//} +func ClassifyProcessList(c *gin.Context) { + var ( + err error + classifyIdList []int + classifyList []*struct { + process2.Classify + ProcessList []*process2.Info `json:"process_list"` + } + ) + + processName := c.DefaultQuery("name", "") + if processName == "" { + err = orm.Eloquent.Model(&process2.Classify{}).Find(&classifyList).Error + if err != nil { + app.Error(c, -1, err, fmt.Sprintf("获取分类列表失败,%v", err.Error())) + return + } + } else { + err = orm.Eloquent.Model(&process2.Info{}). + Where("name LIKE ?", fmt.Sprintf("%%%v%%", processName)). + Pluck("distinct classify", &classifyIdList).Error + if err != nil { + app.Error(c, -1, err, fmt.Sprintf("获取分类失败,%v", err.Error())) + return + } + + err = orm.Eloquent.Model(&process2.Classify{}). + Where("id in (?)", classifyIdList). + Find(&classifyList).Error + if err != nil { + app.Error(c, -1, err, fmt.Sprintf("获取分类失败,%v", err.Error())) + return + } + } + + for _, item := range classifyList { + err = orm.Eloquent.Model(&process2.Info{}). + Where("classify = ? and name LIKE ?", item.Id, fmt.Sprintf("%%%v%%", processName)). + Select("id, create_time, update_time, name"). + Find(&item.ProcessList).Error + if err != nil { + app.Error(c, -1, err, fmt.Sprintf("获取流程失败,%v", err.Error())) + return + } + } + + app.OK(c, classifyList, "成功获取数据") +} diff --git a/apis/process/task.go b/apis/process/task.go index 6c80c4e..f753db7 100644 --- a/apis/process/task.go +++ b/apis/process/task.go @@ -1,230 +1,235 @@ package process -//import ( -// "ferry/pkg/pagination" -// "ferry/pkg/response/code" -// . "ferry/pkg/response/response" -// "fmt" -// "io/ioutil" -// "os" -// "strings" -// -// "github.com/gin-gonic/gin" -// uuid "github.com/satori/go.uuid" -// "github.com/spf13/viper" -//) -// -///* -// @Author : lanyulei -//*/ -// -//// 任务列表 -//func TaskList(c *gin.Context) { -// var ( -// err error -// pageValue pagination.ListRequest -// taskName string -// taskData []map[string]interface{} -// total_count int -// ) -// taskName = c.DefaultQuery("name", "") -// -// err = c.ShouldBind(&pageValue) -// if err != nil { -// Response(c, code.BindError, nil, err.Error()) -// return -// } -// -// getFileDetails := func(fn string) map[string]interface{} { -// file := make(map[string]interface{}) -// fileClassify := strings.Split(fn, ".") -// fileDetails := strings.Split(fileClassify[0], "-") -// switch fileClassify[1] { -// case "py": -// file["classify"] = "Python" -// case "sh": -// file["classify"] = "Shell" -// default: -// file["classify"] = "Other" -// } -// if len(fileDetails) == 3 { -// file["name"] = fileDetails[0] -// file["uuid"] = fileDetails[1] -// file["creator"] = fileDetails[2] -// } -// file["full_name"] = fn -// return file -// } -// files, _ := ioutil.ReadDir(viper.GetString("script.path")) -// var endIndex int -// if taskName != "" { -// for _, f := range files { -// if strings.Contains(strings.Split(f.Name(), "-")[0], taskName) { -// taskData = append(taskData, getFileDetails(f.Name())) -// } -// } -// total_count = len(taskData) -// if pageValue.Page*pageValue.PerPage > len(taskData) { -// endIndex = len(taskData) -// } else { -// endIndex = pageValue.Page * pageValue.PerPage -// } -// taskData = taskData[(pageValue.Page-1)*pageValue.PerPage : endIndex] -// } else { -// if pageValue.Page*pageValue.PerPage > len(files) { -// endIndex = len(files) -// } else { -// endIndex = pageValue.Page * pageValue.PerPage -// } -// for _, f := range files[(pageValue.Page-1)*pageValue.PerPage : endIndex] { -// taskData = append(taskData, getFileDetails(f.Name())) -// } -// total_count = len(files) -// } -// -// Response(c, nil, map[string]interface{}{ -// "data": taskData, -// "page": pageValue.Page, -// "per_page": pageValue.PerPage, -// "total_count": total_count, -// }, "") -//} -// -//// 创建任务 -//func CreateTask(c *gin.Context) { -// type Task struct { -// Name string `json:"name"` -// Classify string `json:"classify"` -// Content string `json:"content"` -// } -// -// var ( -// err error -// taskValue Task -// ) -// -// err = c.ShouldBind(&taskValue) -// if err != nil { -// Response(c, code.BindError, nil, err.Error()) -// return -// } -// -// uuidValue := uuid.Must(uuid.NewV4(), err) -// fileName := fmt.Sprintf("%v/%v-%v-%v", -// viper.GetString("script.path"), -// taskValue.Name, -// strings.Split(uuidValue.String(), "-")[4], -// c.GetString("username"), -// ) -// if taskValue.Classify == "python" { -// fileName = fileName + ".py" -// } else if taskValue.Classify == "shell" { -// fileName = fileName + ".sh" -// } -// -// err = ioutil.WriteFile(fileName, []byte(taskValue.Content), 0666) -// if err != nil { -// Response(c, code.BindError, nil, fmt.Sprintf("创建任务脚本失败: %v", err.Error())) -// return -// } -// -// Response(c, nil, nil, "") -//} -// -//// 更新任务 -//func UpdateTask(c *gin.Context) { -// type fileDetails struct { -// Name string `json:"name"` -// FullName string `json:"full_name"` -// Classify string `json:"classify"` -// Content string `json:"content"` -// } -// -// var ( -// err error -// file fileDetails -// ) -// -// err = c.ShouldBind(&file) -// if err != nil { -// Response(c, code.BindError, nil, "") -// return -// } -// -// fullNameList := strings.Split(file.FullName, "-") -// if fullNameList[0] != file.Name { -// fullNameList[0] = file.Name -// } -// var suffixName string -// if strings.ToLower(file.Classify) == "python" { -// suffixName = ".py" -// } else if strings.ToLower(file.Classify) == "shell" { -// suffixName = ".sh" -// } -// -// if fullNameList[len(fullNameList)-1][len(fullNameList[len(fullNameList)-1])-3:len(fullNameList[len(fullNameList)-1])] != suffixName { -// tList := strings.Split(fullNameList[len(fullNameList)-1], ".") -// tList[len(tList)-1] = suffixName[1:len(suffixName)] -// fullNameList[len(fullNameList)-1] = strings.Join(tList, ".") -// } -// -// fileFullName := strings.Join(fullNameList, "-") -// -// // 修改文件内容 -// err = ioutil.WriteFile(fmt.Sprintf("%v/%v", viper.GetString("script.path"), fileFullName), []byte(file.Content), 0666) -// if err != nil { -// Response(c, code.BindError, nil, fmt.Sprintf("更新脚本文件失败,%v", err.Error())) -// return -// } -// -// // 修改文件名称 -// err = os.Rename( -// fmt.Sprintf("%v/%v", viper.GetString("script.path"), file.FullName), -// fmt.Sprintf("%v/%v", viper.GetString("script.path"), fileFullName), -// ) -// if err != nil { -// Response(c, code.BindError, nil, fmt.Sprintf("更改脚本文件名称失败,%v", err.Error())) -// return -// } -// -// Response(c, nil, nil, "") -//} -// -//// 删除任务 -//func DeleteTask(c *gin.Context) { -// fullName := c.DefaultQuery("full_name", "") -// if fullName == "" { -// Response(c, code.InternalServerError, nil, "参数不正确,请确定参数full_name是否传递") -// return -// } -// -// err := os.Remove(fmt.Sprintf("%v/%v", viper.GetString("script.path"), fullName)) -// if err != nil { -// Response(c, code.DeleteError, nil, fmt.Sprintf("删除文件失败,%v", err.Error())) -// return -// } -// -// Response(c, nil, nil, "") -//} -// -//// 任务详情 -//func TaskDetails(c *gin.Context) { -// var ( -// err error -// fileName string -// content []byte -// ) -// -// fileName = c.DefaultQuery("file_name", "") -// if fileName == "" { -// Response(c, code.ParamError, nil, "参数不正确,请确认file_name参数是否存在") -// return -// } -// -// content, err = ioutil.ReadFile(fmt.Sprintf("%v/%v", viper.GetString("script.path"), fileName)) -// if err != nil { -// return -// } -// -// Response(c, nil, string(content), "") -//} +import ( + "errors" + "ferry/pkg/pagination" + "ferry/tools" + "ferry/tools/app" + "fmt" + "io/ioutil" + "os" + "strings" + + "github.com/gin-gonic/gin" + uuid "github.com/satori/go.uuid" + "github.com/spf13/viper" +) + +/* + @Author : lanyulei +*/ + +// 任务列表 +func TaskList(c *gin.Context) { + var ( + err error + pageValue pagination.ListRequest + taskName string + taskData []map[string]interface{} + totalCount int + ) + taskName = c.DefaultQuery("name", "") + + err = c.ShouldBind(&pageValue) + if err != nil { + app.Error(c, -1, err, "") + return + } + + if pageValue.Page == 0 { + pageValue.Page = 1 + } + + if pageValue.PerPage == 0 { + pageValue.PerPage = 10 + } + + getFileDetails := func(fn string) map[string]interface{} { + file := make(map[string]interface{}) + fileClassify := strings.Split(fn, ".") + fileDetails := strings.Split(fileClassify[0], "-") + switch fileClassify[1] { + case "py": + file["classify"] = "Python" + case "sh": + file["classify"] = "Shell" + default: + file["classify"] = "Other" + } + if len(fileDetails) == 3 { + file["name"] = fileDetails[0] + file["uuid"] = fileDetails[1] + file["creator"] = fileDetails[2] + } + file["full_name"] = fn + return file + } + files, _ := ioutil.ReadDir(viper.GetString("script.path")) + var endIndex int + if taskName != "" { + for _, f := range files { + if strings.Contains(strings.Split(f.Name(), "-")[0], taskName) { + taskData = append(taskData, getFileDetails(f.Name())) + } + } + totalCount = len(taskData) + if pageValue.Page*pageValue.PerPage > len(taskData) { + endIndex = len(taskData) + } else { + endIndex = pageValue.Page * pageValue.PerPage + } + taskData = taskData[(pageValue.Page-1)*pageValue.PerPage : endIndex] + } else { + if pageValue.Page*pageValue.PerPage > len(files) { + endIndex = len(files) + } else { + endIndex = pageValue.Page * pageValue.PerPage + } + for _, f := range files[(pageValue.Page-1)*pageValue.PerPage : endIndex] { + taskData = append(taskData, getFileDetails(f.Name())) + } + totalCount = len(files) + } + + app.OK(c, map[string]interface{}{ + "data": taskData, + "page": pageValue.Page, + "per_page": pageValue.PerPage, + "total_count": totalCount, + }, "") +} + +// 创建任务 +func CreateTask(c *gin.Context) { + var ( + err error + taskValue struct { + Name string `json:"name"` + Classify string `json:"classify"` + Content string `json:"content"` + } + ) + + err = c.ShouldBind(&taskValue) + if err != nil { + app.Error(c, -1, err, "") + return + } + + uuidValue := uuid.Must(uuid.NewV4(), err) + fileName := fmt.Sprintf("%v/%v-%v-%v", + viper.GetString("script.path"), + taskValue.Name, + strings.Split(uuidValue.String(), "-")[4], + tools.GetUserName(c), + ) + if taskValue.Classify == "python" { + fileName = fileName + ".py" + } else if taskValue.Classify == "shell" { + fileName = fileName + ".sh" + } + + err = ioutil.WriteFile(fileName, []byte(taskValue.Content), 0666) + if err != nil { + app.Error(c, -1, err, fmt.Sprintf("创建任务脚本失败: %v", err.Error())) + return + } + + app.OK(c, "", "任务创建成功") +} + +// 更新任务 +func UpdateTask(c *gin.Context) { + var ( + err error + file struct { + Name string `json:"name"` + FullName string `json:"full_name"` + Classify string `json:"classify"` + Content string `json:"content"` + } + ) + + err = c.ShouldBind(&file) + if err != nil { + app.Error(c, -1, err, "") + return + } + + fullNameList := strings.Split(file.FullName, "-") + if fullNameList[0] != file.Name { + fullNameList[0] = file.Name + } + var suffixName string + if strings.ToLower(file.Classify) == "python" { + suffixName = ".py" + } else if strings.ToLower(file.Classify) == "shell" { + suffixName = ".sh" + } + + if fullNameList[len(fullNameList)-1][len(fullNameList[len(fullNameList)-1])-3:len(fullNameList[len(fullNameList)-1])] != suffixName { + tList := strings.Split(fullNameList[len(fullNameList)-1], ".") + tList[len(tList)-1] = suffixName[1:len(suffixName)] + fullNameList[len(fullNameList)-1] = strings.Join(tList, ".") + } + + fileFullName := strings.Join(fullNameList, "-") + + // 修改文件内容 + err = ioutil.WriteFile(fmt.Sprintf("%v/%v", viper.GetString("script.path"), fileFullName), []byte(file.Content), 0666) + if err != nil { + app.Error(c, -1, err, fmt.Sprintf("更新脚本文件失败,%v", err.Error())) + return + } + + // 修改文件名称 + err = os.Rename( + fmt.Sprintf("%v/%v", viper.GetString("script.path"), file.FullName), + fmt.Sprintf("%v/%v", viper.GetString("script.path"), fileFullName), + ) + if err != nil { + app.Error(c, -1, err, fmt.Sprintf("更改脚本文件名称失败,%v", err.Error())) + return + } + + app.OK(c, "", "更新成功") +} + +// 删除任务 +func DeleteTask(c *gin.Context) { + fullName := c.DefaultQuery("full_name", "") + if fullName == "" { + app.Error(c, -1, errors.New("参数不正确,请确定参数full_name是否传递"), "") + return + } + + err := os.Remove(fmt.Sprintf("%v/%v", viper.GetString("script.path"), fullName)) + if err != nil { + app.Error(c, -1, err, fmt.Sprintf("删除文件失败,%v", err.Error())) + return + } + + app.OK(c, nil, "任务删除成功") +} + +// 任务详情 +func TaskDetails(c *gin.Context) { + var ( + err error + fileName string + content []byte + ) + + fileName = c.DefaultQuery("file_name", "") + if fileName == "" { + app.Error(c, -1, errors.New("参数不正确,请确认file_name参数是否存在"), "") + return + } + + content, err = ioutil.ReadFile(fmt.Sprintf("%v/%v", viper.GetString("script.path"), fileName)) + if err != nil { + return + } + + app.OK(c, string(content), "") +} diff --git a/apis/process/workOrder.go b/apis/process/workOrder.go index b2cec85..3cd0e0a 100644 --- a/apis/process/workOrder.go +++ b/apis/process/workOrder.go @@ -1,400 +1,403 @@ package process -//import ( -// "encoding/json" -// "errors" -// "ferry/models/user" -// "ferry/models/workOrder" -// "ferry/pkg/connection" -// "ferry/pkg/response/code" -// . "ferry/pkg/response/response" -// "ferry/pkg/service" -// "fmt" -// "strconv" -// -// "github.com/gin-gonic/gin" -//) -// -///* -// @Author : lanyulei -//*/ -// -//// 流程结构包括节点,流转和模版 -//func ProcessStructure(c *gin.Context) { -// processId := c.DefaultQuery("processId", "") -// if processId == "" { -// Response(c, code.InternalServerError, nil, "参数不正确,请确定参数processId是否传递") -// return -// } -// workOrderId := c.DefaultQuery("workOrderId", "0") -// if processId == "" { -// Response(c, code.InternalServerError, nil, "参数不正确,请确定参数processId是否传递") -// return -// } -// workOrderIdInt, _ := strconv.Atoi(workOrderId) -// processIdInt, _ := strconv.Atoi(processId) -// result, err := service.ProcessStructure(c, processIdInt, workOrderIdInt) -// if err != nil { -// Response(c, code.SelectError, nil, err.Error()) -// return -// } -// -// if workOrderIdInt != 0 { -// currentState := result["workOrder"].(service.WorkOrderData).CurrentState -// userAuthority, err := service.JudgeUserAuthority(c, workOrderIdInt, currentState) -// if err != nil { -// Response(c, code.InternalServerError, nil, fmt.Sprintf("判断用户是否有权限失败,%v", err.Error())) -// return -// } -// result["userAuthority"] = userAuthority -// } -// -// Response(c, nil, result, "") -//} -// -//// 新建工单 -//func CreateWorkOrder(c *gin.Context) { -// var workOrderValue struct { -// workOrder.Info -// Tpls map[string][]interface{} `json:"tpls"` -// SourceState string `json:"source_state"` -// Tasks json.RawMessage `json:"tasks"` -// Source string `json:"source"` -// } -// -// err := c.ShouldBind(&workOrderValue) -// if err != nil { -// Response(c, code.BindError, nil, err.Error()) -// return -// } -// -// relatedPerson, err := json.Marshal([]int{c.GetInt("userId")}) -// if err != nil { -// Response(c, code.BindError, nil, err.Error()) -// return -// } -// -// // 创建工单数据 -// tx := connection.DB.Self.Begin() -// var workOrderInfo = workOrder.Info{ -// Title: workOrderValue.Title, -// Process: workOrderValue.Process, -// Classify: workOrderValue.Classify, -// State: workOrderValue.State, -// RelatedPerson: relatedPerson, -// Creator: c.GetInt("userId"), -// } -// err = tx.Create(&workOrderInfo).Error -// if err != nil { -// tx.Rollback() -// Response(c, code.CreateError, nil, fmt.Sprintf("创建工单失败,%v", err.Error())) -// return -// } -// -// // 创建工单模版关联数据 -// for i := 0; i < len(workOrderValue.Tpls["form_structure"]); i++ { -// formDataJson, err := json.Marshal(workOrderValue.Tpls["form_data"][i]) -// if err != nil { -// tx.Rollback() -// Response(c, code.InternalServerError, nil, fmt.Sprintf("生成json字符串错误,%v", err.Error())) -// return -// } -// formStructureJson, err := json.Marshal(workOrderValue.Tpls["form_structure"][i]) -// if err != nil { -// tx.Rollback() -// Response(c, code.InternalServerError, nil, fmt.Sprintf("生成json字符串错误,%v", err.Error())) -// return -// } -// -// formData := workOrder.TplData{ -// WorkOrder: workOrderInfo.Id, -// FormStructure: formStructureJson, -// FormData: formDataJson, -// } -// -// err = tx.Create(&formData).Error -// if err != nil { -// tx.Rollback() -// Response(c, code.CreateError, nil, fmt.Sprintf("创建工单模版关联数据失败,%v", err.Error())) -// return -// } -// } -// -// // 获取当前用户信息 -// var userInfo user.Info -// err = tx.Model(&user.Info{}).Where("id = ?", c.GetInt("userId")).Find(&userInfo).Error -// if err != nil { -// tx.Rollback() -// Response(c, code.SelectError, nil, fmt.Sprintf("查询用户信息失败,%v", err.Error())) -// return -// } -// -// nameValue := userInfo.Nickname -// if nameValue == "" { -// nameValue = userInfo.Username -// } -// -// // 创建历史记录 -// var stateList []map[string]interface{} -// err = json.Unmarshal(workOrderInfo.State, &stateList) -// if err != nil { -// tx.Rollback() -// Response(c, code.InternalServerError, nil, fmt.Sprintf("Json序列化失败,%v", err.Error())) -// return -// } -// err = tx.Create(&workOrder.CirculationHistory{ -// Title: workOrderValue.Title, -// WorkOrder: workOrderInfo.Id, -// State: workOrderValue.SourceState, -// Source: workOrderValue.Source, -// Target: stateList[0]["id"].(string), -// Circulation: "新建", -// Processor: nameValue, -// ProcessorId: userInfo.Id, -// }).Error -// if err != nil { -// tx.Rollback() -// err = fmt.Errorf("新建历史记录失败,%v", err.Error()) -// return -// } -// -// tx.Commit() -// -// // 执行任务 -// var taskList []string -// err = json.Unmarshal(workOrderValue.Tasks, &taskList) -// if err != nil { -// Response(c, code.InternalServerError, nil, err.Error()) -// return -// } -// go service.ExecTask(taskList) -// -// Response(c, nil, nil, "") -//} -// -//// 工单列表 -//func WorkOrderList(c *gin.Context) { -// /* -// 1. 待办工单 -// 2. 我创建的 -// 3. 我相关的 -// 4. 所有工单 -// */ -// -// var ( -// result interface{} -// err error -// classifyInt int -// ) -// -// classify := c.DefaultQuery("classify", "0") -// if classify == "" { -// Response(c, code.ParamError, nil, "参数错误,请确认classify是否传递") -// return -// } -// -// classifyInt, _ = strconv.Atoi(classify) -// result, err = service.WorkOrderList(c, classifyInt) -// if err != nil { -// Response(c, code.SelectError, nil, fmt.Sprintf("查询工单数据失败,%v", err.Error())) -// return -// } -// -// Response(c, nil, result, "") -//} -// -//// 处理工单 -//func ProcessWorkOrder(c *gin.Context) { -// var ( -// err error -// userAuthority bool -// handle service.Handle -// params struct { -// Tasks []string -// TargetState string `json:"target_state"` // 目标状态 -// SourceState string `json:"source_state"` // 源状态 -// WorkOrderId int `json:"work_order_id"` // 工单ID -// Circulation string `json:"circulation"` // 流转ID -// FlowProperties int `json:"flow_properties"` // 流转类型 0 拒绝,1 同意,2 其他 -// } -// ) -// -// err = c.ShouldBind(¶ms) -// if err != nil { -// Response(c, code.BindError, nil, err.Error()) -// return -// } -// -// // 处理工单 -// userAuthority, err = service.JudgeUserAuthority(c, params.WorkOrderId, params.SourceState) -// if err != nil { -// Response(c, code.InternalServerError, nil, fmt.Sprintf("判断用户是否有权限失败,%v", err.Error())) -// return -// } -// if !userAuthority { -// err = errors.New("当前用户没有权限进行此操作") -// return -// } -// -// err = handle.HandleWorkOrder( -// c, -// params.WorkOrderId, // 工单ID -// params.Tasks, // 任务列表 -// params.TargetState, // 目标节点 -// params.SourceState, // 源节点 -// params.Circulation, // 流转标题 -// params.FlowProperties, // 流转属性 -// ) -// if err != nil { -// Response(c, code.InternalServerError, nil, fmt.Sprintf("处理工单失败,%v", err.Error())) -// return -// } -// -// Response(c, nil, nil, "") -//} -// -//// 结束工单 -//func UnityWorkOrder(c *gin.Context) { -// var ( -// err error -// workOrderId string -// workOrderInfo workOrder.Info -// ) -// -// workOrderId = c.DefaultQuery("work_oroder_id", "") -// if workOrderId == "" { -// Response(c, code.InternalServerError, nil, "参数不正确,work_oroder_id") -// return -// } -// -// tx := connection.DB.Self.Begin() -// -// // 查询工单信息 -// err = connection.DB.Self.Model(&workOrderInfo). -// Where("id = ?", workOrderId). -// Find(&workOrderInfo).Error -// if err != nil { -// Response(c, code.SelectError, nil, fmt.Sprintf("查询工单失败,%v", err.Error())) -// return -// } -// if workOrderInfo.IsEnd == 1 { -// Response(c, code.UpdateError, nil, "工单已结束") -// return -// } -// -// // 更新工单状态 -// err = tx.Model(&workOrder.Info{}). -// Where("id = ?", workOrderId). -// Update("is_end", 1). -// Error -// if err != nil { -// tx.Rollback() -// Response(c, code.UpdateError, nil, fmt.Sprintf("结束工单失败,%v", err.Error())) -// return -// } -// -// // 写入历史 -// tx.Create(&workOrder.CirculationHistory{ -// Title: workOrderInfo.Title, -// WorkOrder: workOrderInfo.Id, -// State: "结束工单", -// Circulation: "结束", -// Processor: c.GetString("nickname"), -// ProcessorId: c.GetInt("userId"), -// Remarks: "手动结束工单。", -// }) -// -// tx.Commit() -// -// Response(c, nil, nil, "") -//} -// -//// 转交工单 -//func InversionWorkOrder(c *gin.Context) { -// var ( -// err error -// workOrderInfo workOrder.Info -// stateList []map[string]interface{} -// stateValue []byte -// currentState map[string]interface{} -// userInfo user.Info -// params struct { -// WorkOrderId int `json:"work_order_id"` -// NodeId string `json:"node_id"` -// UserId int `json:"user_id"` -// Remarks string `json:"remarks"` -// } -// ) -// -// err = c.ShouldBind(¶ms) -// if err != nil { -// Response(c, code.BindError, nil, err.Error()) -// return -// } -// -// // 查询工单信息 -// err = connection.DB.Self.Model(&workOrderInfo). -// Where("id = ?", params.WorkOrderId). -// Find(&workOrderInfo).Error -// if err != nil { -// Response(c, code.SelectError, nil, fmt.Sprintf("查询工单信息失败,%v", err.Error())) -// return -// } -// -// // 序列化节点数据 -// err = json.Unmarshal(workOrderInfo.State, &stateList) -// if err != nil { -// Response(c, code.InternalServerError, nil, fmt.Sprintf("节点数据反序列化失败,%v", err.Error())) -// return -// } -// -// for _, s := range stateList { -// if s["id"].(string) == params.NodeId { -// s["processor"] = []interface{}{params.UserId} -// s["process_method"] = "person" -// currentState = s -// break -// } -// } -// -// stateValue, err = json.Marshal(stateList) -// if err != nil { -// Response(c, code.InternalServerError, nil, fmt.Sprintf("节点数据序列化失败,%v", err.Error())) -// return -// } -// -// tx := connection.DB.Self.Begin() -// -// // 更新数据 -// err = tx.Model(&workOrder.Info{}). -// Where("id = ?", params.WorkOrderId). -// Update("state", stateValue).Error -// if err != nil { -// Response(c, code.UpdateError, nil, fmt.Sprintf("更新节点信息失败,%v", err.Error())) -// return -// } -// -// // 查询用户信息 -// err = connection.DB.Self.Model(&user.Info{}). -// Where("id = ?", params.UserId). -// Find(&userInfo).Error -// if err != nil { -// Response(c, code.SelectError, nil, fmt.Sprintf("查询用户信息失败,%v", err.Error())) -// return -// } -// -// // 添加转交历史 -// tx.Create(&workOrder.CirculationHistory{ -// Title: workOrderInfo.Title, -// WorkOrder: workOrderInfo.Id, -// State: currentState["label"].(string), -// Circulation: "转交", -// Processor: c.GetString("nickname"), -// ProcessorId: c.GetInt("userId"), -// Remarks: fmt.Sprintf("此阶段负责人已转交给《%v》", userInfo.Nickname), -// }) -// -// tx.Commit() -// -// Response(c, nil, nil, "") -//} +import ( + "encoding/json" + "errors" + "ferry/global/orm" + "ferry/models/process" + "ferry/models/system" + . "ferry/pkg/response/response" + "ferry/pkg/service" + "ferry/tools" + "ferry/tools/app" + "fmt" + "strconv" + + "github.com/gin-gonic/gin" +) + +/* + @Author : lanyulei +*/ + +// 流程结构包括节点,流转和模版 +func ProcessStructure(c *gin.Context) { + processId := c.DefaultQuery("processId", "") + if processId == "" { + app.Error(c, -1, errors.New("参数不正确,请确定参数processId是否传递"), "") + return + } + workOrderId := c.DefaultQuery("workOrderId", "0") + if workOrderId == "" { + app.Error(c, -1, errors.New("参数不正确,请确定参数workOrderId是否传递"), "") + return + } + workOrderIdInt, _ := strconv.Atoi(workOrderId) + processIdInt, _ := strconv.Atoi(processId) + result, err := service.ProcessStructure(c, processIdInt, workOrderIdInt) + if err != nil { + app.Error(c, -1, err, "") + return + } + + if workOrderIdInt != 0 { + currentState := result["workOrder"].(service.WorkOrderData).CurrentState + userAuthority, err := service.JudgeUserAuthority(c, workOrderIdInt, currentState) + if err != nil { + app.Error(c, -1, err, fmt.Sprintf("判断用户是否有权限失败,%v", err.Error())) + return + } + result["userAuthority"] = userAuthority + } + + app.OK(c, result, "数据获取成功") +} + +// 新建工单 +func CreateWorkOrder(c *gin.Context) { + var ( + userInfo system.SysUser + workOrderValue struct { + process.WorkOrderInfo + Tpls map[string][]interface{} `json:"tpls"` + SourceState string `json:"source_state"` + Tasks json.RawMessage `json:"tasks"` + Source string `json:"source"` + } + ) + + err := c.ShouldBind(&workOrderValue) + if err != nil { + app.Error(c, -1, err, "") + return + } + + relatedPerson, err := json.Marshal([]int{tools.GetUserId(c)}) + if err != nil { + app.Error(c, -1, err, "") + return + } + + // 创建工单数据 + tx := orm.Eloquent.Begin() + var workOrderInfo = process.WorkOrderInfo{ + Title: workOrderValue.Title, + Process: workOrderValue.Process, + Classify: workOrderValue.Classify, + State: workOrderValue.State, + RelatedPerson: relatedPerson, + Creator: tools.GetUserId(c), + } + err = tx.Create(&workOrderInfo).Error + if err != nil { + tx.Rollback() + app.Error(c, -1, err, fmt.Sprintf("创建工单失败,%v", err.Error())) + return + } + + // 创建工单模版关联数据 + for i := 0; i < len(workOrderValue.Tpls["form_structure"]); i++ { + formDataJson, err := json.Marshal(workOrderValue.Tpls["form_data"][i]) + if err != nil { + tx.Rollback() + app.Error(c, -1, err, fmt.Sprintf("生成json字符串错误,%v", err.Error())) + return + } + formStructureJson, err := json.Marshal(workOrderValue.Tpls["form_structure"][i]) + if err != nil { + tx.Rollback() + app.Error(c, -1, err, fmt.Sprintf("生成json字符串错误,%v", err.Error())) + return + } + + formData := process.TplData{ + WorkOrder: workOrderInfo.Id, + FormStructure: formStructureJson, + FormData: formDataJson, + } + + err = tx.Create(&formData).Error + if err != nil { + tx.Rollback() + app.Error(c, -1, err, fmt.Sprintf("创建工单模版关联数据失败,%v", err.Error())) + return + } + } + + // 获取当前用户信息 + err = tx.Model(&system.SysUser{}).Where("user_id = ?", tools.GetUserId(c)).Find(&userInfo).Error + if err != nil { + tx.Rollback() + app.Error(c, -1, err, fmt.Sprintf("查询用户信息失败,%v", err.Error())) + return + } + + nameValue := userInfo.NickName + if nameValue == "" { + nameValue = userInfo.Username + } + + // 创建历史记录 + var stateList []map[string]interface{} + err = json.Unmarshal(workOrderInfo.State, &stateList) + if err != nil { + tx.Rollback() + app.Error(c, -1, err, fmt.Sprintf("Json序列化失败,%v", err.Error())) + return + } + err = tx.Create(&process.CirculationHistory{ + Title: workOrderValue.Title, + WorkOrder: workOrderInfo.Id, + State: workOrderValue.SourceState, + Source: workOrderValue.Source, + Target: stateList[0]["id"].(string), + Circulation: "新建", + Processor: nameValue, + ProcessorId: userInfo.UserId, + }).Error + if err != nil { + tx.Rollback() + app.Error(c, -1, err, fmt.Sprintf("新建历史记录失败,%v", err.Error())) + return + } + + tx.Commit() + + // 执行任务 + var taskList []string + err = json.Unmarshal(workOrderValue.Tasks, &taskList) + if err != nil { + app.Error(c, -1, err, "") + return + } + go service.ExecTask(taskList) + + app.OK(c, "", "成功提交工单申请") +} + +// 工单列表 +func WorkOrderList(c *gin.Context) { + /* + 1. 待办工单 + 2. 我创建的 + 3. 我相关的 + 4. 所有工单 + */ + + var ( + result interface{} + err error + classifyInt int + ) + + classify := c.DefaultQuery("classify", "0") + if classify == "" { + app.Error(c, -1, errors.New("参数错误,请确认classify是否传递"), "") + return + } + + classifyInt, _ = strconv.Atoi(classify) + result, err = service.WorkOrderList(c, classifyInt) + if err != nil { + app.Error(c, -1, err, fmt.Sprintf("查询工单数据失败,%v", err.Error())) + return + } + + app.OK(c, result, "") +} + +// 处理工单 +func ProcessWorkOrder(c *gin.Context) { + var ( + err error + userAuthority bool + handle service.Handle + params struct { + Tasks []string + TargetState string `json:"target_state"` // 目标状态 + SourceState string `json:"source_state"` // 源状态 + WorkOrderId int `json:"work_order_id"` // 工单ID + Circulation string `json:"circulation"` // 流转ID + FlowProperties int `json:"flow_properties"` // 流转类型 0 拒绝,1 同意,2 其他 + } + ) + + err = c.ShouldBind(¶ms) + if err != nil { + app.Error(c, -1, err, "") + return + } + + // 处理工单 + userAuthority, err = service.JudgeUserAuthority(c, params.WorkOrderId, params.SourceState) + if err != nil { + app.Error(c, -1, err, fmt.Sprintf("判断用户是否有权限失败,%v", err.Error())) + return + } + if !userAuthority { + app.Error(c, -1, errors.New("当前用户没有权限进行此操作"), "") + return + } + + err = handle.HandleWorkOrder( + c, + params.WorkOrderId, // 工单ID + params.Tasks, // 任务列表 + params.TargetState, // 目标节点 + params.SourceState, // 源节点 + params.Circulation, // 流转标题 + params.FlowProperties, // 流转属性 + ) + if err != nil { + app.Error(c, -1, nil, fmt.Sprintf("处理工单失败,%v", err.Error())) + return + } + + app.OK(c, nil, "工单处理完成") +} + +// 结束工单 +func UnityWorkOrder(c *gin.Context) { + var ( + err error + workOrderId string + workOrderInfo process.WorkOrderInfo + ) + + workOrderId = c.DefaultQuery("work_oroder_id", "") + if workOrderId == "" { + app.Error(c, -1, errors.New("参数不正确,work_oroder_id"), "") + return + } + + tx := orm.Eloquent.Begin() + + // 查询工单信息 + err = tx.Model(&workOrderInfo). + Where("id = ?", workOrderId). + Find(&workOrderInfo).Error + if err != nil { + app.Error(c, -1, err, fmt.Sprintf("查询工单失败,%v", err.Error())) + return + } + if workOrderInfo.IsEnd == 1 { + app.Error(c, -1, errors.New("工单已结束"), "") + return + } + + // 更新工单状态 + err = tx.Model(&process.WorkOrderInfo{}). + Where("id = ?", workOrderId). + Update("is_end", 1). + Error + if err != nil { + tx.Rollback() + app.Error(c, -1, err, fmt.Sprintf("结束工单失败,%v", err.Error())) + return + } + + // 写入历史 + tx.Create(&process.CirculationHistory{ + Title: workOrderInfo.Title, + WorkOrder: workOrderInfo.Id, + State: "结束工单", + Circulation: "结束", + Processor: c.GetString("nickname"), + ProcessorId: tools.GetUserId(c), + Remarks: "手动结束工单。", + }) + + tx.Commit() + + app.OK(c, nil, "工单已结束") +} + +// 转交工单 +func InversionWorkOrder(c *gin.Context) { + var ( + err error + workOrderInfo process.WorkOrderInfo + stateList []map[string]interface{} + stateValue []byte + currentState map[string]interface{} + userInfo system.SysUser + params struct { + WorkOrderId int `json:"work_order_id"` + NodeId string `json:"node_id"` + UserId int `json:"user_id"` + Remarks string `json:"remarks"` + } + ) + + err = c.ShouldBind(¶ms) + if err != nil { + app.Error(c, -1, err, "") + return + } + + // 查询工单信息 + err = orm.Eloquent.Model(&workOrderInfo). + Where("id = ?", params.WorkOrderId). + Find(&workOrderInfo).Error + if err != nil { + app.Error(c, -1, err, fmt.Sprintf("查询工单信息失败,%v", err.Error())) + return + } + + // 序列化节点数据 + err = json.Unmarshal(workOrderInfo.State, &stateList) + if err != nil { + app.Error(c, -1, err, fmt.Sprintf("节点数据反序列化失败,%v", err.Error())) + return + } + + for _, s := range stateList { + if s["id"].(string) == params.NodeId { + s["processor"] = []interface{}{params.UserId} + s["process_method"] = "person" + currentState = s + break + } + } + + stateValue, err = json.Marshal(stateList) + if err != nil { + app.Error(c, -1, err, fmt.Sprintf("节点数据序列化失败,%v", err.Error())) + return + } + + tx := orm.Eloquent.Begin() + + // 更新数据 + err = tx.Model(&process.WorkOrderInfo{}). + Where("id = ?", params.WorkOrderId). + Update("state", stateValue).Error + if err != nil { + app.Error(c, -1, err, fmt.Sprintf("更新节点信息失败,%v", err.Error())) + return + } + + // 查询用户信息 + err = tx.Model(&system.SysUser{}). + Where("user_id = ?", params.UserId). + Find(&userInfo).Error + if err != nil { + app.Error(c, -1, err, fmt.Sprintf("查询用户信息失败,%v", err.Error())) + return + } + + // 添加转交历史 + tx.Create(&process.CirculationHistory{ + Title: workOrderInfo.Title, + WorkOrder: workOrderInfo.Id, + State: currentState["label"].(string), + Circulation: "转交", + Processor: c.GetString("nickname"), + ProcessorId: tools.GetUserId(c), + Remarks: fmt.Sprintf("此阶段负责人已转交给《%v》", userInfo.NickName), + }) + + tx.Commit() + + app.OK(c, nil, "工单已手动结单") +} diff --git a/config/settings.dev.yml b/config/settings.dev.yml index d79d606..ce4f27b 100644 --- a/config/settings.dev.yml +++ b/config/settings.dev.yml @@ -1,3 +1,5 @@ +script: + path: ./public/scripts settings: application: domain: localhost:8000 diff --git a/config/settings.yml b/config/settings.yml index de5f9ed..fba802e 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -24,3 +24,5 @@ settings: password: 123456 port: 3306 username: root +script: + path: ./public/scripts \ No newline at end of file diff --git a/handler/auth.go b/handler/auth.go index 5b90451..2dea237 100644 --- a/handler/auth.go +++ b/handler/auth.go @@ -120,7 +120,7 @@ func LogOut(c *gin.Context) { loginlog.Platform = ua.Platform() loginlog.Username = tools.GetUserName(c) loginlog.Msg = "退出成功" - loginlog.Create() + _, _ = loginlog.Create() c.JSON(http.StatusOK, gin.H{ "code": 200, "msg": "退出成功", diff --git a/pkg/service/getPrincipal.go b/pkg/service/getPrincipal.go index 56215d2..b58b4b5 100644 --- a/pkg/service/getPrincipal.go +++ b/pkg/service/getPrincipal.go @@ -1,8 +1,8 @@ package service import ( - "ferry/models/user" - "ferry/pkg/connection" + "ferry/global/orm" + "ferry/models/system" "strings" ) @@ -20,22 +20,17 @@ func GetPrincipal(processor []int, processMethod string) (principals string, err var principalList []string switch processMethod { case "person": - err = connection.DB.Self.Model(&user.Info{}). + err = orm.Eloquent.Model(&system.SysUser{}). Where("id in (?)", processor). Pluck("nickname", &principalList).Error if err != nil { return } - case "persongroup": - err = connection.DB.Self.Model(&user.Group{}).Where("id in (?)", processor).Pluck("nickname", &principalList).Error - if err != nil { - return - } - case "department": - err = connection.DB.Self.Model(&user.Dept{}).Where("id in (?)", processor).Pluck("nickname", &principalList).Error - if err != nil { - return - } + //case "department": + // err = orm.Eloquent.Model(&user.Dept{}).Where("id in (?)", processor).Pluck("nickname", &principalList).Error + // if err != nil { + // return + // } case "variable": for _, p := range processor { switch p { diff --git a/pkg/service/handle.go b/pkg/service/handle.go index 9bc4593..4693b84 100644 --- a/pkg/service/handle.go +++ b/pkg/service/handle.go @@ -3,10 +3,10 @@ package service import ( "encoding/json" "errors" + "ferry/global/orm" "ferry/models/base" "ferry/models/process" - "ferry/models/workOrder" - "ferry/pkg/connection" + "ferry/tools" "fmt" "reflect" "time" @@ -37,13 +37,13 @@ import ( */ type Handle struct { - cirHistoryList []workOrder.CirculationHistory + cirHistoryList []process.CirculationHistory workOrderId int updateValue map[string]interface{} stateValue map[string]interface{} targetStateValue map[string]interface{} workOrderData [][]byte - workOrderDetails workOrder.Info + workOrderDetails process.WorkOrderInfo endHistory bool flowProperties int circulationValue string @@ -86,7 +86,7 @@ func (h *Handle) Countersign(c *gin.Context) (err error) { break } for _, processor := range currentState["processor"].([]interface{}) { - if cirHistoryValue.ProcessorId != c.GetInt("userId") && + if cirHistoryValue.ProcessorId != tools.GetUserId(c) && cirHistoryValue.Source == currentState["id"].(string) && cirHistoryValue.ProcessorId == int(processor.(float64)) { cirHistoryCount += 1 @@ -114,7 +114,7 @@ func (h *Handle) circulation() (err error) { return } - err = h.tx.Model(&workOrder.Info{}). + err = h.tx.Model(&process.WorkOrderInfo{}). Where("id = ?", h.workOrderId). Updates(map[string]interface{}{ "state": stateValue, @@ -321,8 +321,8 @@ func (h *Handle) HandleWorkOrder( var ( execTasks []string relatedPersonList []int - cirHistoryValue []workOrder.CirculationHistory - cirHistoryData workOrder.CirculationHistory + cirHistoryValue []process.CirculationHistory + cirHistoryData process.CirculationHistory costDurationValue string sourceEdges []map[string]interface{} targetEdges []map[string]interface{} @@ -347,13 +347,13 @@ func (h *Handle) HandleWorkOrder( }() // 获取工单信息 - err = connection.DB.Self.Model(&workOrder.Info{}).Where("id = ?", workOrderId).Find(&h.workOrderDetails).Error + err = orm.Eloquent.Model(&process.WorkOrderInfo{}).Where("id = ?", workOrderId).Find(&h.workOrderDetails).Error if err != nil { return } // 获取流程信息 - err = connection.DB.Self.Model(&process.Info{}).Where("id = ?", h.workOrderDetails.Process).Find(&processInfo).Error + err = orm.Eloquent.Model(&process.Info{}).Where("id = ?", h.workOrderDetails.Process).Find(&processInfo).Error if err != nil { return } @@ -375,7 +375,7 @@ func (h *Handle) HandleWorkOrder( } // 获取工单数据 - err = connection.DB.Self.Model(&workOrder.TplData{}). + err = orm.Eloquent.Model(&process.TplData{}). Where("work_order = ?", workOrderId). Pluck("form_data", &h.workOrderData).Error if err != nil { @@ -383,7 +383,7 @@ func (h *Handle) HandleWorkOrder( } // 根据处理人查询出需要会签的条数 - err = connection.DB.Self.Model(&workOrder.CirculationHistory{}). + err = orm.Eloquent.Model(&process.CirculationHistory{}). Where("work_order = ?", workOrderId). Order("id desc"). Find(&h.cirHistoryList).Error @@ -397,13 +397,13 @@ func (h *Handle) HandleWorkOrder( } relatedPersonStatus := false for _, r := range relatedPersonList { - if r == c.GetInt("userId") { + if r == tools.GetUserId(c) { relatedPersonStatus = true break } } if !relatedPersonStatus { - relatedPersonList = append(relatedPersonList, c.GetInt("userId")) + relatedPersonList = append(relatedPersonList, tools.GetUserId(c)) } relatedPersonValue, err = json.Marshal(relatedPersonList) @@ -416,7 +416,7 @@ func (h *Handle) HandleWorkOrder( } // 开启事务 - h.tx = connection.DB.Self.Begin() + h.tx = orm.Eloquent.Begin() stateValue := map[string]interface{}{ "label": h.targetStateValue["label"].(string), @@ -591,7 +591,7 @@ func (h *Handle) HandleWorkOrder( h.tx.Rollback() return } - err = h.tx.Model(&workOrder.Info{}). + err = h.tx.Model(&process.WorkOrderInfo{}). Where("id = ?", h.workOrderId). Update("is_end", 1).Error if err != nil { @@ -601,7 +601,7 @@ func (h *Handle) HandleWorkOrder( } // 流转历史写入 - err = connection.DB.Self.Model(&cirHistoryValue). + err = orm.Eloquent.Model(&cirHistoryValue). Where("work_order = ?", workOrderId). Find(&cirHistoryValue). Order("create_time desc").Error @@ -616,7 +616,7 @@ func (h *Handle) HandleWorkOrder( } } - cirHistoryData = workOrder.CirculationHistory{ + cirHistoryData = process.CirculationHistory{ Model: base.Model{}, Title: h.workOrderDetails.Title, WorkOrder: h.workOrderDetails.Id, @@ -625,7 +625,7 @@ func (h *Handle) HandleWorkOrder( Target: h.targetStateValue["id"].(string), Circulation: circulationValue, Processor: c.GetString("nickname"), - ProcessorId: c.GetInt("userId"), + ProcessorId: tools.GetUserId(c), CostDuration: costDurationValue, } @@ -637,14 +637,14 @@ func (h *Handle) HandleWorkOrder( // 判断目标是否是结束节点 if h.targetStateValue["clazz"] == "end" && h.endHistory == true { - err = h.tx.Create(&workOrder.CirculationHistory{ + err = h.tx.Create(&process.CirculationHistory{ Model: base.Model{}, Title: h.workOrderDetails.Title, WorkOrder: h.workOrderDetails.Id, State: h.targetStateValue["label"].(string), Source: h.targetStateValue["id"].(string), Processor: c.GetString("nickname"), - ProcessorId: c.GetInt("userId"), + ProcessorId: tools.GetUserId(c), Circulation: "结束", }).Error if err != nil { diff --git a/pkg/service/process.go b/pkg/service/process.go index 124c58b..f5d4913 100644 --- a/pkg/service/process.go +++ b/pkg/service/process.go @@ -3,10 +3,9 @@ package service import ( "encoding/json" "errors" + "ferry/global/orm" "ferry/models/process" - "ferry/models/tpl" - "ferry/models/workOrder" - "ferry/pkg/connection" + "ferry/tools" "fmt" "strconv" @@ -18,7 +17,7 @@ import ( */ type WorkOrderData struct { - workOrder.Info + process.WorkOrderInfo CurrentState string `json:"current_state"` } @@ -27,14 +26,14 @@ func ProcessStructure(c *gin.Context, processId int, workOrderId int) (result ma processValue process.Info processStructureDetails map[string]interface{} processNode []map[string]interface{} - tplDetails []*tpl.Info + tplDetails []*process.TplInfo workOrderInfo WorkOrderData - workOrderTpls []*workOrder.TplData - workOrderHistory []*workOrder.CirculationHistory + workOrderTpls []*process.TplData + workOrderHistory []*process.CirculationHistory stateList []map[string]interface{} ) - err = connection.DB.Self.Model(&processValue).Where("id = ?", processId).Find(&processValue).Error + err = orm.Eloquent.Model(&processValue).Where("id = ?", processId).Find(&processValue).Error if err != nil { err = fmt.Errorf("查询流程失败,%v", err.Error()) return @@ -77,7 +76,7 @@ func ProcessStructure(c *gin.Context, processId int, workOrderId int) (result ma } // 获取历史记录 - err = connection.DB.Self.Model(&workOrder.CirculationHistory{}). + err = orm.Eloquent.Model(&process.CirculationHistory{}). Where("work_order = ?", workOrderId). Order("id desc"). Find(&workOrderHistory).Error @@ -94,7 +93,7 @@ func ProcessStructure(c *gin.Context, processId int, workOrderId int) (result ma err = fmt.Errorf("json转map失败,%v", err.Error()) return } - err = connection.DB.Self.Model(&tplDetails). + err = orm.Eloquent.Model(&tplDetails). Where("id in (?)", tplIdList). Find(&tplDetails).Error if err != nil { @@ -104,7 +103,7 @@ func ProcessStructure(c *gin.Context, processId int, workOrderId int) (result ma result["tpls"] = tplDetails } else { // 查询工单信息 - err = connection.DB.Self.Model(&workOrder.Info{}). + err = orm.Eloquent.Model(&process.WorkOrderInfo{}). Where("id = ?", workOrderId). Scan(&workOrderInfo).Error if err != nil { @@ -145,7 +144,7 @@ func ProcessStructure(c *gin.Context, processId int, workOrderId int) (result ma for _, processNodeValue := range processStructureDetails["nodes"].([]interface{}) { if stateValue["id"].(string) == processNodeValue.(map[string]interface{})["id"] { for _, userId := range stateValue["processor"].([]interface{}) { - if int(userId.(float64)) == c.GetInt("userId") { + if int(userId.(float64)) == tools.GetUserId(c) { workOrderInfo.CurrentState = stateValue["id"].(string) break breakStateTag } @@ -162,7 +161,7 @@ func ProcessStructure(c *gin.Context, processId int, workOrderId int) (result ma result["workOrder"] = workOrderInfo // 查询工单表单数据 - err = connection.DB.Self.Model(&workOrderTpls). + err = orm.Eloquent.Model(&workOrderTpls). Where("work_order = ?", workOrderId). Find(&workOrderTpls).Error if err != nil { diff --git a/pkg/service/userAuthority.go b/pkg/service/userAuthority.go index bb9a816..6db3038 100644 --- a/pkg/service/userAuthority.go +++ b/pkg/service/userAuthority.go @@ -2,10 +2,9 @@ package service import ( "encoding/json" + "ferry/global/orm" "ferry/models/process" - "ferry/models/user" - "ferry/models/workOrder" - "ferry/pkg/connection" + "ferry/tools" "github.com/gin-gonic/gin" ) @@ -22,10 +21,10 @@ func JudgeUserAuthority(c *gin.Context, workOrderId int, currentState string) (s variable 变量 */ var ( - workOrderInfo workOrder.Info - userInfo user.Info - userDept user.Dept - cirHistoryList []workOrder.CirculationHistory + workOrderInfo process.WorkOrderInfo + //userInfo system.SysUser + //userDept system.Dept + cirHistoryList []process.CirculationHistory stateValue map[string]interface{} processInfo process.Info processState ProcessState @@ -33,7 +32,7 @@ func JudgeUserAuthority(c *gin.Context, workOrderId int, currentState string) (s currentStateValue map[string]interface{} ) // 获取工单信息 - err = connection.DB.Self.Model(&workOrderInfo). + err = orm.Eloquent.Model(&workOrderInfo). Where("id = ?", workOrderId). Find(&workOrderInfo).Error if err != nil { @@ -41,7 +40,7 @@ func JudgeUserAuthority(c *gin.Context, workOrderId int, currentState string) (s } // 获取流程信息 - err = connection.DB.Self.Model(&process.Info{}).Where("id = ?", workOrderInfo.Process).Find(&processInfo).Error + err = orm.Eloquent.Model(&process.Info{}).Where("id = ?", workOrderInfo.Process).Find(&processInfo).Error if err != nil { return } @@ -71,7 +70,7 @@ func JudgeUserAuthority(c *gin.Context, workOrderId int, currentState string) (s if currentStateValue["processor"] != nil && len(currentStateValue["processor"].([]interface{})) > 1 { if isCounterSign, ok := stateValue["isCounterSign"]; ok { if isCounterSign.(bool) { - err = connection.DB.Self.Model(&workOrder.CirculationHistory{}). + err = orm.Eloquent.Model(&process.CirculationHistory{}). Where("work_order = ?", workOrderId). Order("id desc"). Find(&cirHistoryList).Error @@ -82,7 +81,7 @@ func JudgeUserAuthority(c *gin.Context, workOrderId int, currentState string) (s if cirHistoryValue.Source != stateValue["id"] { break } - if cirHistoryValue.Source == stateValue["id"] && cirHistoryValue.ProcessorId == c.GetInt("userId") { + if cirHistoryValue.Source == stateValue["id"] && cirHistoryValue.ProcessorId == tools.GetUserId(c) { return } } @@ -93,54 +92,54 @@ func JudgeUserAuthority(c *gin.Context, workOrderId int, currentState string) (s switch currentStateValue["process_method"].(string) { case "person": for _, processorValue := range currentStateValue["processor"].([]interface{}) { - if int(processorValue.(float64)) == c.GetInt("userId") { + if int(processorValue.(float64)) == tools.GetUserId(c) { status = true } } - case "persongroup": - var persongroupCount int - err = connection.DB.Self.Model(&user.UserGroup{}). - Where("group in (?) and user = ?", currentStateValue["processor"].([]interface{}), c.GetInt("userId")). - Count(&persongroupCount).Error - if err != nil { - return - } - if persongroupCount > 0 { - status = true - } - case "department": - var departmentCount int - err = connection.DB.Self.Model(&user.Info{}). - Where("dept in (?) and id = ?", currentStateValue["processor"].([]interface{}), c.GetInt("userId")). - Count(&departmentCount).Error - if err != nil { - return - } - if departmentCount > 0 { - status = true - } + //case "persongroup": + // var persongroupCount int + // err = orm.Eloquent.Model(&user.UserGroup{}). + // Where("group in (?) and user = ?", currentStateValue["processor"].([]interface{}), tools.GetUserId(c)). + // Count(&persongroupCount).Error + // if err != nil { + // return + // } + // if persongroupCount > 0 { + // status = true + // } + //case "department": + // var departmentCount int + // err = orm.Eloquent.Model(&system.SysUser{}). + // Where("dept in (?) and id = ?", currentStateValue["processor"].([]interface{}), tools.GetUserId(c)). + // Count(&departmentCount).Error + // if err != nil { + // return + // } + // if departmentCount > 0 { + // status = true + // } case "variable": for _, p := range currentStateValue["processor"].([]interface{}) { switch int(p.(float64)) { case 1: - if workOrderInfo.Creator == c.GetInt("userId") { - status = true - } - case 2: - err = connection.DB.Self.Model(&userInfo).Where("id = ?", workOrderInfo.Creator).Find(&userInfo).Error - if err != nil { - return - } - err = connection.DB.Self.Model(&userDept).Where("id = ?", userInfo.Dept).Find(&userDept).Error - if err != nil { - return - } - - if userDept.Approver == c.GetInt("userId") { - status = true - } else if userDept.Leader == c.GetInt("userId") { + if workOrderInfo.Creator == tools.GetUserId(c) { status = true } + //case 2: + // err = orm.Eloquent.Model(&userInfo).Where("id = ?", workOrderInfo.Creator).Find(&userInfo).Error + // if err != nil { + // return + // } + // err = orm.Eloquent.Model(&userDept).Where("id = ?", userInfo.Dept).Find(&userDept).Error + // if err != nil { + // return + // } + // + // if userDept.Approver == tools.GetUserId(c) { + // status = true + // } else if userDept.Leader == tools.GetUserId(c) { + // status = true + // } } } } diff --git a/pkg/service/workOrderList.go b/pkg/service/workOrderList.go index 2ac31e3..cbeb2f3 100644 --- a/pkg/service/workOrderList.go +++ b/pkg/service/workOrderList.go @@ -2,12 +2,12 @@ package service import ( "encoding/json" - "ferry/models/user" - "ferry/models/workOrder" - "ferry/pkg/connection" + "ferry/global/orm" + "ferry/models/process" + "ferry/models/system" "ferry/pkg/pagination" + "ferry/tools" "fmt" - "strings" "github.com/gin-gonic/gin" ) @@ -18,21 +18,21 @@ import ( func WorkOrderList(c *gin.Context, classify int) (result interface{}, err error) { type workOrderInfo struct { - workOrder.Info + process.WorkOrderInfo Principals string `json:"principals"` DataClassify int `json:"data_classify"` } var ( workOrderInfoList []workOrderInfo principals string - userInfo user.Info + userInfo system.SysUser StateList []map[string]interface{} ) title := c.DefaultQuery("title", "") - db := connection.DB.Self.Model(&workOrder.Info{}).Where("title like ?", fmt.Sprintf("%%%v%%", title)) + db := orm.Eloquent.Model(&process.WorkOrderInfo{}).Where("title like ?", fmt.Sprintf("%%%v%%", title)) - err = connection.DB.Self.Model(&user.Info{}).Where("id = ?", c.GetInt("userId")).Find(&userInfo).Error + err = orm.Eloquent.Model(&system.SysUser{}).Where("id = ?", tools.GetUserId(c)).Find(&userInfo).Error if err != nil { return } @@ -42,47 +42,51 @@ func WorkOrderList(c *gin.Context, classify int) (result interface{}, err error) case 1: // 待办工单 // 1. 个人 - personSelect := fmt.Sprintf("(JSON_CONTAINS(state, JSON_OBJECT('processor', %v)) and JSON_CONTAINS(state, JSON_OBJECT('process_method', 'person')))", c.GetInt("userId")) + personSelect := fmt.Sprintf("(JSON_CONTAINS(state, JSON_OBJECT('processor', %v)) and JSON_CONTAINS(state, JSON_OBJECT('process_method', 'person')))", tools.GetUserId(c)) // 2. 小组 - groupList := make([]int, 0) - err = connection.DB.Self.Model(&user.UserGroup{}). - Where("user = ?", c.GetInt("userId")). - Pluck("`group`", &groupList).Error - if err != nil { - return - } - groupSqlList := make([]string, 0) - if len(groupList) > 0 { - for _, group := range groupList { - groupSqlList = append(groupSqlList, fmt.Sprintf("JSON_CONTAINS(state, JSON_OBJECT('processor', %v))", group)) - } - } else { - groupSqlList = append(groupSqlList, fmt.Sprintf("JSON_CONTAINS(state, JSON_OBJECT('processor', 0))")) - } - - personGroupSelect := fmt.Sprintf( - "((%v) and %v)", - strings.Join(groupSqlList, " or "), - "JSON_CONTAINS(state, JSON_OBJECT('process_method', 'persongroup'))", - ) + //groupList := make([]int, 0) + //err = orm.Eloquent.Model(&user.UserGroup{}). + // Where("user = ?", tools.GetUserId(c)). + // Pluck("`group`", &groupList).Error + //if err != nil { + // return + //} + //groupSqlList := make([]string, 0) + //if len(groupList) > 0 { + // for _, group := range groupList { + // groupSqlList = append(groupSqlList, fmt.Sprintf("JSON_CONTAINS(state, JSON_OBJECT('processor', %v))", group)) + // } + //} else { + // groupSqlList = append(groupSqlList, fmt.Sprintf("JSON_CONTAINS(state, JSON_OBJECT('processor', 0))")) + //} + // + //personGroupSelect := fmt.Sprintf( + // "((%v) and %v)", + // strings.Join(groupSqlList, " or "), + // "JSON_CONTAINS(state, JSON_OBJECT('process_method', 'persongroup'))", + //) // 3. 部门 - departmentSelect := fmt.Sprintf("(JSON_CONTAINS(state, JSON_OBJECT('processor', %v)) and JSON_CONTAINS(state, JSON_OBJECT('process_method', 'department')))", userInfo.Dept) + //departmentSelect := fmt.Sprintf("(JSON_CONTAINS(state, JSON_OBJECT('processor', %v)) and JSON_CONTAINS(state, JSON_OBJECT('process_method', 'department')))", userInfo.Dept) // 4. 变量 - variableSelect := fmt.Sprintf("((%v) or (%v))", - fmt.Sprintf("JSON_CONTAINS(state, JSON_OBJECT('processor', 1)) and JSON_CONTAINS(state, JSON_OBJECT('process_method', 'variable')) and creator = %v", c.GetInt("userId")), - fmt.Sprintf("JSON_CONTAINS(state, JSON_OBJECT('processor', 2)) and JSON_CONTAINS(state, JSON_OBJECT('process_method', 'variable')) and creator = %v", userInfo.Dept), + variableSelect := fmt.Sprintf("(%v)", + fmt.Sprintf("JSON_CONTAINS(state, JSON_OBJECT('processor', 1)) and JSON_CONTAINS(state, JSON_OBJECT('process_method', 'variable')) and creator = %v", tools.GetUserId(c)), ) + //variableSelect := fmt.Sprintf("((%v) or (%v))", + // fmt.Sprintf("JSON_CONTAINS(state, JSON_OBJECT('processor', 1)) and JSON_CONTAINS(state, JSON_OBJECT('process_method', 'variable')) and creator = %v", tools.GetUserId(c)), + // fmt.Sprintf("JSON_CONTAINS(state, JSON_OBJECT('processor', 2)) and JSON_CONTAINS(state, JSON_OBJECT('process_method', 'variable')) and creator = %v", userInfo.Dept), + //) - db = db.Where(fmt.Sprintf("(%v or %v or %v or %v) and is_end = 0", personSelect, personGroupSelect, departmentSelect, variableSelect)) + //db = db.Where(fmt.Sprintf("(%v or %v or %v or %v) and is_end = 0", personSelect, personGroupSelect, departmentSelect, variableSelect)) + db = db.Where(fmt.Sprintf("(%v or %v) and is_end = 0", personSelect, variableSelect)) case 2: // 我创建的 - db = db.Where("creator = ?", c.GetInt("userId")) + db = db.Where("creator = ?", tools.GetUserId(c)) case 3: // 我相关的 - db = db.Where(fmt.Sprintf("JSON_CONTAINS(related_person, '%v')", c.GetInt("userId"))) + db = db.Where(fmt.Sprintf("JSON_CONTAINS(related_person, '%v')", tools.GetUserId(c))) case 4: // 所有工单 default: diff --git a/router/process/process.go b/router/process/process.go index 9806ef5..120b3a2 100644 --- a/router/process/process.go +++ b/router/process/process.go @@ -15,7 +15,7 @@ import ( func RegisterProcessRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { processRouter := v1.Group("/process").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) { - //processRouter.GET("/classify", process.ClassifyProcessList) + processRouter.GET("/classify", process.ClassifyProcessList) processRouter.GET("", process.ProcessList) processRouter.POST("", process.CreateProcess) processRouter.PUT("", process.UpdateProcess) diff --git a/router/process/task.go b/router/process/task.go index 7c19112..631deee 100644 --- a/router/process/task.go +++ b/router/process/task.go @@ -1,6 +1,8 @@ package process import ( + "ferry/apis/process" + "ferry/middleware" jwt "ferry/pkg/jwtauth" "github.com/gin-gonic/gin" @@ -11,12 +13,12 @@ import ( */ func RegisterTaskRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { - //taskRouter := v1.Group("/task").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) - //{ - // taskRouter.GET("", process.TaskList) - // taskRouter.GET("/details", process.TaskDetails) - // taskRouter.POST("", process.CreateTask) - // taskRouter.PUT("", process.UpdateTask) - // taskRouter.DELETE("", process.DeleteTask) - //} + taskRouter := v1.Group("/task").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) + { + taskRouter.GET("", process.TaskList) + taskRouter.GET("/details", process.TaskDetails) + taskRouter.POST("", process.CreateTask) + taskRouter.PUT("", process.UpdateTask) + taskRouter.DELETE("", process.DeleteTask) + } } diff --git a/router/process/workOrder.go b/router/process/workOrder.go index c30c4d4..6a6a608 100644 --- a/router/process/workOrder.go +++ b/router/process/workOrder.go @@ -5,19 +5,21 @@ package process import ( + "ferry/apis/process" + "ferry/middleware" jwt "ferry/pkg/jwtauth" "github.com/gin-gonic/gin" ) func RegisterWorkOrderRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { - //workOrderRouter := v1.Group("/work-order").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) - //{ - // workOrderRouter.GET("/process-structure", process.ProcessStructure) - // workOrderRouter.POST("/create", process.CreateWorkOrder) - // workOrderRouter.GET("/list", process.WorkOrderList) - // workOrderRouter.POST("/handle", process.ProcessWorkOrder) - // workOrderRouter.GET("/unity", process.UnityWorkOrder) - // workOrderRouter.POST("/inversion", process.InversionWorkOrder) - //} + workOrderRouter := v1.Group("/work-order").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) + { + workOrderRouter.GET("/process-structure", process.ProcessStructure) + workOrderRouter.POST("/create", process.CreateWorkOrder) + workOrderRouter.GET("/list", process.WorkOrderList) + workOrderRouter.POST("/handle", process.ProcessWorkOrder) + workOrderRouter.GET("/unity", process.UnityWorkOrder) + workOrderRouter.POST("/inversion", process.InversionWorkOrder) + } }