123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- package service
- import (
- "errors"
- "sync"
- "time"
- "github.com/go-workflow/go-workflow/workflow-engine/flow"
- "github.com/mumushuiding/util"
- "github.com/go-workflow/go-workflow/workflow-engine/model"
- )
- var saveLock sync.Mutex
- // Procdef 流程定义表
- type Procdef struct {
- Name string `json:"name"`
- // 流程定义json字符串
- Resource *flow.Node `json:"resource"`
- // 用户id
- Userid string `json:"userid"`
- Username string `json:"username"`
- // 用户所在公司
- Company string `json:"company"`
- PageSize int `json:"pageSize"`
- PageIndex int `json:"pageIndex"`
- }
- // GetProcdefByID 根据流程定义id获取流程定义
- func GetProcdefByID(id int) (*model.Procdef, error) {
- return model.GetProcdefByID(id)
- }
- // GetProcdefLatestByNameAndCompany GetProcdefLatestByNameAndCompany
- // 根据流程定义名字和公司查询流程定义
- func GetProcdefLatestByNameAndCompany(name, company string) (*model.Procdef, error) {
- return model.GetProcdefLatestByNameAndCompany(name, company)
- }
- // GetResourceByNameAndCompany GetResourceByNameAndCompany
- // 获取流程定义配置信息
- func GetResourceByNameAndCompany(name, company string) (*flow.Node, int, string, error) {
- prodef, err := GetProcdefLatestByNameAndCompany(name, company)
- if err != nil {
- return nil, 0, "", err
- }
- if prodef == nil {
- return nil, 0, "", errors.New("流程【" + name + "】不存在")
- }
- node := &flow.Node{}
- err = util.Str2Struct(prodef.Resource, node)
- return node, prodef.ID, prodef.Name, err
- }
- // GetResourceByID GetResourceByID
- // 根据id查询流程定义
- func GetResourceByID(id int) (*flow.Node, int, error) {
- prodef, err := GetProcdefByID(id)
- if err != nil {
- return nil, 0, err
- }
- node := &flow.Node{}
- err = util.Str2Struct(prodef.Resource, node)
- return node, prodef.ID, err
- }
- // SaveProcdefByToken SaveProcdefByToken
- func (p *Procdef) SaveProcdefByToken(token string) (int, error) {
- // 根据 token 获取用户信息
- userinfo, err := GetUserinfoFromRedis(token)
- if err != nil {
- return 0, err
- }
- if len(userinfo.Company) == 0 {
- return 0, errors.New("保存在redis中的【用户信息 userinfo】字段 company 不能为空")
- }
- if len(userinfo.Username) == 0 {
- return 0, errors.New("保存在redis中的【用户信息 userinfo】字段 username 不能为空")
- }
- if len(userinfo.ID) == 0 {
- return 0, errors.New("保存在redis中的【用户信息 userinfo】字段 ID 不能为空")
- }
- p.Company = userinfo.Company
- p.Userid = userinfo.ID
- p.Username = userinfo.Username
- return p.SaveProcdef()
- }
- // SaveProcdef 保存
- func (p *Procdef) SaveProcdef() (id int, err error) {
- // 流程定义有效性检验
- err = IsProdefValid(p.Resource)
- if err != nil {
- return 0, err
- }
- resource, err := util.ToJSONStr(p.Resource)
- if err != nil {
- return 0, err
- }
- // fmt.Println(resource)
- var procdef = model.Procdef{
- Name: p.Name,
- Userid: p.Userid,
- Username: p.Username,
- Company: p.Company,
- Resource: resource,
- }
- return SaveProcdef(&procdef)
- }
- // SaveProcdef 保存
- func SaveProcdef(p *model.Procdef) (id int, err error) {
- // 参数是否为空判定
- saveLock.Lock()
- defer saveLock.Unlock()
- old, err := GetProcdefLatestByNameAndCompany(p.Name, p.Company)
- if err != nil {
- return 0, err
- }
- p.DeployTime = util.FormatDate(time.Now(), util.YYYY_MM_DD_HH_MM_SS)
- if old == nil {
- p.Version = 1
- return p.Save()
- }
- tx := model.GetTx()
- // 保存新版本
- p.Version = old.Version + 1
- err = p.SaveTx(tx)
- if err != nil {
- tx.Rollback()
- return 0, err
- }
- // 转移旧版本
- err = model.MoveProcdefToHistoryByIDTx(old.ID, tx)
- if err != nil {
- tx.Rollback()
- return 0, err
- }
- tx.Commit()
- return p.ID, nil
- }
- // ExistsProcdefByNameAndCompany if exists
- // 查询流程定义是否存在
- func ExistsProcdefByNameAndCompany(name, company string) (yes bool, version int, err error) {
- p, err := GetProcdefLatestByNameAndCompany(name, company)
- if p == nil {
- return false, 1, err
- }
- version = p.Version + 1
- return true, version, err
- }
- // FindAllPageAsJSON find by page and transform result to string
- // 分页查询并将结果转换成 json 字符串
- func (p *Procdef) FindAllPageAsJSON() (string, error) {
- datas, count, err := p.FindAll()
- if err != nil {
- return "", err
- }
- return util.ToPageJSON(datas, count, p.PageIndex, p.PageSize)
- }
- // FindAll FindAll
- func (p *Procdef) FindAll() ([]*model.Procdef, int, error) {
- var page = util.Page{}
- page.PageRequest(p.PageIndex, p.PageSize)
- maps := p.getMaps()
- return model.FindProcdefsWithCountAndPaged(page.PageIndex, page.PageSize, maps)
- }
- func (p *Procdef) getMaps() map[string]interface{} {
- maps := make(map[string]interface{})
- if len(p.Name) > 0 {
- maps["name"] = p.Name
- }
- if len(p.Company) > 0 {
- maps["company"] = p.Company
- }
- return maps
- }
- // DelProcdefByID del by id
- func DelProcdefByID(id int) error {
- return model.DelProcdefByID(id)
- }
- // IsProdefValid 流程定义格式是否有效
- func IsProdefValid(node *flow.Node) error {
- return flow.IfProcessConifgIsValid(node)
- }
|