package model import ( "database/sql/driver" "encoding/json" "errors" "fmt" "github.com/fonchain_enterprise/fonchain-approval-fork/api/approval" "github.com/fonchain_enterprise/fonchain-approval-fork/pkg/common/page" msg "github.com/fonchain_enterprise/fonchain-approval-fork/pkg/m" "github.com/jinzhu/copier" "gorm.io/gorm" "gorm.io/plugin/soft_delete" "strconv" "time" ) type KeyInfo struct { ApprovalKey string ApprovalName string ApprovalType string ApprovalValue string ApprovalMark bool } type KeyInfos []KeyInfo // Approval 审批 type Approval struct { ID uint64 `gorm:"primaryKey;column:id" json:"id"` DeletedAt soft_delete.DeletedAt `gorm:"column:deleted_at" json:"deletedAt"` CreatedAt time.Time `gorm:"column:created_at" json:"createdAt"` UpdatedAt time.Time `gorm:"column:updated_at" json:"updatedAt"` SubmitterID uint64 `gorm:"column:submitter_id" json:"submitterId"` Status int8 `gorm:"column:status" json:"status"` SubmitterName string `gorm:"column:submitter_name" json:"submitterName"` CopyUsers CopyUsers `gorm:"column:copy_users" json:"copyUsers"` ApprovalUsers ApprovalUsers `gorm:"column:approval_users" json:"approvalUsers"` Type string `gorm:"column:type" json:"type"` Level uint8 `gorm:"column:level" json:"level"` NowLevel uint8 `gorm:"column:now_level" json:"nowLevel"` NowUserId uint64 `gorm:"column:now_user_id" json:"nowUserId"` NowUserName string `gorm:"column:now_user_name" json:"nowUserName"` Content string `gorm:"column:content" json:"content"` ValueJson KeyInfos `gorm:"type:json;column:value_json;default:null;comment:自定义信息" json:"valueJson"` Reply string `gorm:"column:reply" json:"reply"` Domain *string `gorm:"column:domain" json:"domain"` Show *Show `gorm:"foreignKey:ApprovalID" json:"Show"` ApprovalType *ApprovalType `gorm:"foreignKey:KeyWord;references:Type" json:"approvalType"` // type类型 Work *Work `gorm:"foreignKey:ApprovalID" json:"Work"` Bundle *Bundle `gorm:"foreignKey:ApprovalID" json:"Bundle"` Exhibition *Exhibition `gorm:"foreignKey:ApprovalID" json:"Exhibition"` BundlePayPrice *BundlePayPrice `gorm:"foreignKey:ApprovalID" json:"BundlePayPrice"` //关联的type ExhibitionReward *ExhibitionReward `gorm:"foreignKey:ApprovalID" json:"ExhibitionReward"` //关联的type ApprovalWorkFlows []*ApprovalWorkFlow `gorm:"foreignKey:ApprovalID" json:"ApprovalWorkFlows"` ApprovalOA *ApprovalOA `gorm:"foreignKey:ApprovalID" json:"oa"` FinancialForm *FinancialForm `gorm:"foreignKey:ApprovalID" json:"financialForm"` } func (j *KeyInfos) Scan(src interface{}) error { return json.Unmarshal(src.([]byte), j) } func (j KeyInfos) Value() (driver.Value, error) { v, err := json.Marshal(j) return string(v), err } const ( TypeContent = "content" TypeWork = "work" TypeExhibition = "exhibition" TypeShow = "show" TypeBundle = "bundle" TypeBundlePayPrice = "bundlePayPrice" TypeArtExhibitionReward = "artExhibitionReward" TypeOa = "oa" // oa 父类 TypeMakeUp = "makeUp" TypeFinancialForm = "financialFormApply" ) const ( StatusDoing = 1 StatusOk = 2 StatusFail = 3 ) const ( StatusNeedViewed = 4 StatusViewed = 5 ) type ApprovalContentInterface interface { GetApproval(id uint64) (*Approval, error) SaveApprovalContent(in *approval.CreateRequest, a *Approval) error UpdateApprovalContent(in *approval.CreateRequest, a *Approval) error BuildResContent(a *Approval, request *approval.CreateRequest) DeleteApproval(p *Approval) error } // TableName get sql table name.获取数据库表名 func (m *Approval) TableName() string { return "approval" } func preValidateExhibition(in *approval.CreateRequest) error { if in.Type != TypeExhibition { return nil } total := GetExhibitionNumByUser(in.Domain, in.SubmitterID) if total <= 0 { return errors.New("您现在可选数量为0,请先申请画展包数量") } if len(in.Exhibition.ApprovalExhibitions) > int(total) { errStr := fmt.Sprintf("您现在可选数量为%d,申请画展包数量为 %d", len(in.Exhibition.ApprovalExhibitions), total) return errors.New(errStr) } return nil } /* func preValidateExhibition(in *approval.CreateRequest) error { var entity *Bundle if in.Type != TypeExhibition { return nil } if in.Exhibition == nil || in.Exhibition.PidApprovalID == 0 { return errors.New(msg.ErrorApprovalType) } if err := DB.Where(Bundle{ApprovalID: in.Exhibition.PidApprovalID}).First(&entity).Error; err != nil { return err } if len(in.Exhibition.ApprovalExhibitions) != int(entity.ApplicationsNum) { return errors.New(msg.ErrorWrongNum) } return nil } */ // GetExhibitionNumByUser 获取用户可以使用的画展包数量 func GetExhibitionNumByUser(domain string, submitterID uint64) int64 { var total, usedNum int64 //已经使用的 str := `SELECT SUM(exhibition.num) AS total FROM exhibition left join approval ON approval.id = exhibition.approval_id WHERE approval.STATUS != ? AND approval.domain = ? AND approval.submitter_id = ? AND approval.type = ? AND approval.deleted_at=0` DB.Raw(str, StatusFail, domain, submitterID, TypeExhibition).Scan(&usedNum) fmt.Println("已经使用", usedNum) //所有的 str1 := `SELECT SUM(bundle.applications_num) AS total FROM bundle left join approval ON approval.id = bundle.approval_id WHERE approval.STATUS = ? AND approval.domain = ? AND approval.submitter_id = ? AND approval.type = ? AND approval.deleted_at=0` DB.Raw(str1, StatusOk, domain, submitterID, TypeBundle).Scan(&total) fmt.Println("所有申请的", total) return total - usedNum } func ExistPayApproval(in *approval.CreateRequest) bool { var count int64 // subQuery1 := DB.Model(&Approval{}).Where(&Approval{SubmitterID: in.SubmitterID, Type: TypeBundlePayPrice}). Where("status in (?)", []uint64{StatusDoing, StatusOk}). Select("id") DB.Model(&BundlePayPrice{}).Where("approval_id in (?)", subQuery1).Where(&BundlePayPrice{ShowUid: in.BundlePayPrice.ShowUid}).Count(&count) if count >= 1 { return true } return false } // 余额申请 校验 func ExistLeaveApplyApproval(in *approval.CreateRequest) bool { var count int64 // 校验 规则 // 一年一次 多次 一次 subQuery1 := DB.Model(&Approval{}).Where(&Approval{SubmitterID: in.SubmitterID, Type: in.Type}). Where("status in (?)", []uint64{StatusDoing, StatusOk}) if LeaveBalanceUsefulTime[in.Type] == OnceAYear { subQuery1.Where(" date_format(created_at,'%Y') = ?", time.Now().Format("2006")) } subQuery1.Select("id") DB.Model(&ApprovalOA{}).Where("approval_id in (?)", subQuery1).Count(&count) if count >= 1 { return true } return false } func CheckMakeUpApplyApproval(in *approval.CreateRequest) bool { var count int64 // 校验 规则 // 一年一次 多次 一次 subQuery1 := DB.Model(&Approval{}).Where(&Approval{SubmitterID: in.SubmitterID, Type: in.Type}). Where("status in (?)", []uint64{StatusDoing, StatusOk}) subQuery1.Where(" `type` = ? ", in.Type) subQuery1.Select("id") DB.Model(&ApprovalOA{}).Where("approval_id in (?)", subQuery1).Count(&count) if count >= 2 { return true } return false } func StoreApproval(in *approval.CreateRequest) (*Approval, error) { var entity *Approval if err1 := preValidateExhibition(in); err1 != nil { return entity, err1 } fmt.Println("------------t1----------") err := DB.Transaction(func(tx *gorm.DB) error { fmt.Println("------------t2----------") setting, terr := GetApprovalSettingFromKeyWord(in.Domain, in.Type) fmt.Println("1-----", terr, setting) if terr != nil || setting == nil { return errors.New("审批人员没有配置") } fmt.Println("------------t3----------") approvalUsers := setting.GetCombineApproveUsers(FormatApproveUsers(in.ApprovalUsers)) fmt.Println("2-----", approvalUsers) // 保存基本信息 entity = &Approval{ Domain: &in.Domain, SubmitterID: in.SubmitterID, SubmitterName: in.SubmitterName, CopyUsers: setting.CopyUsers, ApprovalUsers: approvalUsers, Type: in.Type, Content: in.Content, ValueJson: ToKeyInfos(in.CustomizeInfo), Status: StatusDoing, Level: uint8(len(approvalUsers)), NowLevel: 1, NowUserId: approvalUsers[0].ID, NowUserName: approvalUsers[0].Name, } fmt.Println(3) fmt.Println(entity) if err := DB.Create(&entity).Error; err != nil { return err } // 不同类型保存不同的结构体 fmt.Println(41, entity) err := entity.SaveContent(in) fmt.Println(4) if err != nil { return err } fmt.Println(5) err = BatchSave(approvalUsers, entity.ID) if err != nil { return err } return BatchCopySave(setting.CopyUsers, entity.ID) }) //fmt.Println("nil", entity) //fmt.Println("nil", entity.ID) return entity, err } func Viewed(in *approval.ViewedRequest) error { var entity *Approval var err error var isView = false if err = DB.First(&entity, in.ID).Error; err != nil { return errors.New(msg.ErrorNotFound) } if entity.Status != StatusOk { return errors.New(msg.ErrorDoingNotView) } copyUsers := entity.CopyUsers for i, temp := range copyUsers { if temp.ID == in.UserID { if temp.IsViewed == true { return errors.New(msg.ErrorAlreadySettingView) } isView = true temp.IsViewed = isView copyUsers[i] = temp } } if isView == false { return errors.New(msg.ErrorSettingView) } err = DB.Model(&Approval{}).Where(&Approval{ID: in.ID}).Updates(&Approval{CopyUsers: copyUsers}).Error if err != nil { return err } DB.Model(&ApprovalCopy{}).Where(&ApprovalCopy{ApprovalID: in.ID, UserId: in.UserID}).Updates(&ApprovalCopy{Status: StatusOk}) return err } func UpdateApproval(in *approval.CreateRequest) (*Approval, error) { var entity *Approval if err1 := preValidateExhibition(in); err1 != nil { return entity, err1 } err := DB.Transaction(func(tx *gorm.DB) error { if departErr := DB.First(&entity, in.ID).Error; departErr != nil { return errors.New(msg.ErrorNotFound) } if entity.Type != in.Type { return errors.New(msg.ErrorChangeType) } // 保存基本信息 upEntity := &Approval{ Content: in.Content, } if entity.Status == StatusFail { upEntity.Status = StatusDoing } if err := DB.Where(&Approval{ID: in.ID}).Updates(&upEntity).Error; err != nil { return err } // 不同类型保存不同的结构体 err := entity.UpdateContent(in) return err }) return entity, err } func approvalCalc(filter *Approval) *approval.Information { var num int64 info := &approval.Information{ Total: 0, DoingTotal: 0, SuccessTotal: 0, FailTotal: 0, } DB.Model(&Approval{}).Where(&filter).Count(&num) info.Total = uint64(num) DB.Model(&Approval{}).Where(&filter).Where(&Approval{Status: StatusDoing}).Count(&num) info.DoingTotal = uint64(num) DB.Model(&Approval{}).Where(&filter).Where(&Approval{Status: StatusOk}).Count(&num) info.SuccessTotal = uint64(num) DB.Model(&Approval{}).Where(&filter).Where(&Approval{Status: StatusFail}).Count(&num) info.FailTotal = uint64(num) return info } func approvalCalcJsonV2(domain string, userId uint64) *approval.Information { var num int64 var jsonStr = "json_contains(approval_users,json_object('ID', ?))" info := &approval.Information{ Total: 0, DoingTotal: 0, SuccessTotal: 0, FailTotal: 0, } DB.Model(&Approval{}).Where(jsonStr, userId).Count(&num) info.Total = uint64(num) DB.Model(&Approval{}).Where(jsonStr, userId).Where(&Approval{Status: StatusDoing, Domain: &domain, NowUserId: userId}).Count(&num) info.DoingTotal = uint64(num) DB.Model(&Approval{}).Where(jsonStr, userId).Where(&Approval{Status: StatusOk, Domain: &domain, NowUserId: userId}).Count(&num) info.SuccessTotal = uint64(num) DB.Model(&Approval{}).Where(jsonStr, userId).Where(&Approval{Status: StatusFail, Domain: &domain, NowUserId: userId}).Count(&num) info.FailTotal = uint64(num) return info } func approvalCalcJson(domain string, userId uint64) *approval.Information { var num int64 var jsonStr = "JSON_CONTAINS(approval_users,JSON_OBJECT('ID', ?))" info := &approval.Information{ Total: 0, DoingTotal: 0, SuccessTotal: 0, FailTotal: 0, } DB.Model(&Approval{}).Where(jsonStr, userId).Count(&num) info.Total = uint64(num) DB.Model(&Approval{}).Where(jsonStr, userId).Where(&Approval{Status: StatusDoing, Domain: &domain}).Count(&num) info.DoingTotal = uint64(num) DB.Model(&Approval{}).Where(jsonStr, userId).Where(&Approval{Status: StatusOk, Domain: &domain}).Count(&num) info.SuccessTotal = uint64(num) DB.Model(&Approval{}).Where(jsonStr, userId).Where(&Approval{Status: StatusFail, Domain: &domain}).Count(&num) info.FailTotal = uint64(num) return info } // ApprovalInfo 统计 func ApprovalInfo(in *approval.InformationRequest) (*approval.InformationResponse, error) { response := &approval.InformationResponse{ MySubmitInfo: approvalCalc(&Approval{Domain: &in.Domain, SubmitterID: in.UserID}), SubmitMeInfo: approvalCalcJsonV2(in.Domain, in.UserID), DomainInfo: approvalCalc(&Approval{Domain: &in.Domain}), } return response, nil } func (m *Approval) GetApprovalInfo() (*Approval, error) { factory, err := getApprovalContentFactory(m.Type) if err != nil { return nil, err } return factory.GetApproval(m.ID) } func (m *Approval) GetApproval(id uint64) (*Approval, error) { var entity *Approval if err := DB. Preload("ApprovalWorkFlows"). Preload("ApprovalType"). First(&entity, id).Error; err != nil { return entity, err } return entity, nil } func (m *Approval) SaveApprovalContent(in *approval.CreateRequest, a *Approval) error { return nil } func (m *Approval) UpdateApprovalContent(in *approval.CreateRequest, a *Approval) error { return nil } func (m *Approval) DeleteApproval(p *Approval) error { return nil } func (m *Approval) DeleteContent() error { factory, err := getApprovalContentFactory(m.Type) if err != nil { return err } return factory.DeleteApproval(m) } func (m *Approval) BuildResContent(a *Approval, request *approval.CreateRequest) { } func (m *Approval) SetResContent(request *approval.CreateRequest) error { fmt.Println(m.Type) factory, err := getApprovalContentFactory(m.Type) fmt.Println(factory, err) if err != nil { return err } fmt.Println("开始执行") factory.BuildResContent(m, request) return nil } func (m *Approval) SaveContent(in *approval.CreateRequest) error { factory, err := getApprovalContentFactory(in.Type) if err != nil { return err } err = factory.SaveApprovalContent(in, m) return err } func (m *Approval) UpdateContent(in *approval.CreateRequest) error { factory, err := getApprovalContentFactory(in.Type) if err != nil { return err } err = factory.UpdateApprovalContent(in, m) return err } // MyAllWorkApprovals 待阅读的和待我操作的 func MyAllWorkApprovals(in *approval.ListRequest) ([]*Approval, int64) { var list []*Approval var ids []string var count int64 //list modelObj := DB.Model(&Approval{}). Preload("Show"). Preload("Work.ApprovalWorks"). Preload("Bundle"). Preload("ApprovalType"). Preload("BundlePayPrice"). Preload("ApprovalType.ApprovalTypeGroup"). Preload("ExhibitionReward.ApprovalExhibitions"). Preload("ApprovalWorkFlows"). Preload("Exhibition.ApprovalExhibitions"). Preload("FinancialForm") fmt.Println("list request :==================== start ===================") fmt.Println(" value ", in) fmt.Println("list request :==================== end ===================") //我未阅读的和我未操作的 queryApproval := &Approval{} if in.SubmitterName != "" { queryApproval.SubmitterName = in.SubmitterName } if in.ApprovalStatus == 0 && in.SubmitterName == "" { // 此处 为 阅读状态 表示 审批状态 默认为 StatusDoing queryApproval.NowUserId = in.UserID queryApproval.Status = StatusDoing } if in.ApprovalStatus <= StatusFail && in.ApprovalStatus > 0 { // 具体 的 审批状态 queryApproval.NowUserId = in.UserID queryApproval.Status = int8(in.ApprovalStatus) } queryApprovalCopy := &ApprovalCopy{} if in.ApprovalStatus > StatusFail { // 具体 的 阅读状态 if in.ApprovalStatus == 4 { queryApprovalCopy.Status = 1 } else if in.ApprovalStatus == 5 { queryApprovalCopy.Status = 2 } queryApproval.Status = StatusOk // 此处 为 阅读状态 表示 审批状态 为 StatusOk } DB.Model(&Approval{}).Where(&Approval{Type: in.Type}).Where(queryApproval).Order("id " + in.OrderBy).Select("id").Find(&ids) s1 := DB.Model(&ApprovalCopy{}).Where(queryApprovalCopy) if in.StartTime != "" && in.EndTime != "" { modelObj = modelObj.Where(" created_at between ? and ? ", in.StartTime, in.EndTime) } fmt.Println("queryApproval request :==================== start ===================") fmt.Printf("queryApproval %+v\n", queryApproval) fmt.Println("queryApproval request :==================== end ===================") if in.SubmitterName == "" && in.ApprovalStatus == 0 { modelObj = modelObj.Where(&Approval{Type: in.Type}).Where( DB.Where(&Approval{NowUserId: in.UserID, Status: StatusDoing}). // 我需要审批的 Or(DB.Where("status = ?", StatusOk).Where("id in (?)", s1.Where("user_id = ?", in.UserID).Select("approval_id")))) // 已完成,抄送给我的 } else { sonQuery := DB.Where(queryApproval) if in.ApprovalStatus > StatusFail || in.ApprovalStatus == 0 { sonQuery.Where(DB.Where("id in (?)", s1.Where("user_id = ?", in.UserID).Select("approval_id"))) } modelObj = modelObj.Where(&Approval{Type: in.Type}).Where( sonQuery) } modelObj.Count(&count) //if len(ids) > 0 { //根据具体id排序 // modelObj = modelObj.Clauses(clause.OrderBy{ // Expression: clause.Expr{SQL: "FIELD(id,?) " + in.OrderBy, Vars: []interface{}{ids}, WithoutParentheses: true}, // }) //} else { modelObj = modelObj.Order("id " + in.OrderBy) //} modelObj.Limit(int(in.PageSize)).Offset(page.GetOffset(in.Page, in.PageSize)).Find(&list) return list, count } func MyApprovalWorkApprovals(in *approval.ListRequest) ([]*Approval, int64) { var list []*Approval var count int64 //list modelObj := DB.Model(&Approval{}). Preload("Show"). Preload("Work.ApprovalWorks"). Preload("Bundle"). Preload("ApprovalType"). Preload("BundlePayPrice"). Preload("ApprovalType.ApprovalTypeGroup"). Preload("ApprovalWorkFlows"). Preload("Exhibition.ApprovalExhibitions"). Preload("FinancialForm"). Preload("ApprovalOA") if in.Type != "" { modelObj = modelObj.Where(&Approval{Type: in.Type}) } /** * 审批展示(抄送在此不表) / \ 进行中 通过或者拒绝 / \ 当前是我审批 我参与审批的 */ if in.UserID != 0 { modelObj = modelObj.Where( DB.Where("JSON_CONTAINS(approval_users,JSON_OBJECT('ID', ?))", in.UserID). Where("status != ?", StatusDoing). //完成,我参与审批 Or(DB.Where("now_user_id", in.UserID).Where("status = ?", StatusDoing)). //进行中,当前审批人是我, Or(DB.Where("JSON_CONTAINS(copy_users,JSON_OBJECT('ID', ?))", in.UserID).Where("status = ?", StatusOk))) //抄送人(完成抄送) } if in.ApprovedBossId != 0 { fmt.Println("---------1--------查看我已经审批过的") subQuery2 := DB.Model(&ApprovalWorkFlow{}). Where("status in (?)", []uint8{StatusOk, StatusFail}). Where(&ApprovalWorkFlow{UserId: in.ApprovedBossId}). Select("approval_id") modelObj = modelObj.Where("id in (?)", subQuery2) } if in.Status != 0 { modelObj = modelObj.Where(&Approval{Status: int8(in.Status)}) } modelObj.Count(&count) modelObj.Order("id " + in.OrderBy).Limit(int(in.PageSize)).Offset(page.GetOffset(in.Page, in.PageSize)).Find(&list) return list, count } func MyWorkApprovals(in *approval.ListRequest) ([]*Approval, int64) { var list []*Approval var count int64 //list modelObj := DB.Model(&Approval{}). Preload("Show"). Preload("Work.ApprovalWorks"). Preload("Bundle"). Preload("ApprovalType"). Preload("BundlePayPrice"). Preload("ApprovalType.ApprovalTypeGroup"). Preload("ExhibitionReward.ApprovalExhibitions"). Preload("ApprovalWorkFlows"). Preload("Exhibition.ApprovalExhibitions"). Preload("FinancialForm"). Preload("ApprovalOA") if in.Type != "" { modelObj = modelObj.Where(&Approval{Type: in.Type}) } if in.SubmitterName != "" { modelObj = modelObj.Where(&Approval{SubmitterName: in.SubmitterName}) } if in.StartTime != "" && in.EndTime != "" { modelObj = modelObj.Where(" created_at between ? and ? ", in.StartTime, in.EndTime) } /** * 审批展示(抄送在此不表) / \ 进行中 通过或者拒绝 / \ 当前是我审批 我参与审批的 */ if in.UserID != 0 { modelObj = modelObj.Where( DB.Where("JSON_CONTAINS(approval_users,JSON_OBJECT('ID', ?))", in.UserID). Where("status != ?", StatusDoing). //完成,我参与审批 Or(DB.Where("now_user_id", in.UserID).Where("status = ?", StatusDoing)). //进行中,当前审批人是我, Or(DB.Where("JSON_CONTAINS(copy_users,JSON_OBJECT('ID', ?))", in.UserID).Where("status = ?", StatusOk))) //抄送人(完成抄送) } if in.ApprovedBossId != 0 { fmt.Println("---------1--------查看我已经审批过的") subQuery2 := DB.Model(&ApprovalWorkFlow{}). Where("status in (?)", []uint8{StatusOk, StatusFail}). Where(&ApprovalWorkFlow{UserId: in.ApprovedBossId}). Select("approval_id") modelObj = modelObj.Where("id in (?)", subQuery2) } if in.Status != 0 { modelObj = modelObj.Where(&Approval{Status: int8(in.Status)}) } modelObj.Count(&count) modelObj.Order("id " + in.OrderBy).Limit(int(in.PageSize)).Offset(page.GetOffset(in.Page, in.PageSize)).Find(&list) return list, count } func MySubmitApprovals(in *approval.ListRequest) ([]*Approval, int64) { var list []*Approval var count int64 //list modelObj := DB.Model(&Approval{}). Preload("Show"). Preload("Work.ApprovalWorks"). Preload("Bundle"). Preload("BundlePayPrice"). Preload("ApprovalWorkFlows"). Preload("ExhibitionReward.ApprovalExhibitions"). Preload("ApprovalType.ApprovalTypeGroup"). Preload("Exhibition.ApprovalExhibitions"). Preload("FinancialForm"). Preload("ApprovalOA") if in.Status != 0 { modelObj = modelObj.Where(&Approval{Status: int8(in.Status)}) } if in.Type != "" { modelObj = modelObj.Where(&Approval{Type: in.Type}) } modelObj = modelObj.Where(&Approval{SubmitterID: in.UserID}) modelObj.Count(&count) modelObj.Limit(int(in.PageSize)).Offset(page.GetOffset(in.Page, in.PageSize)).Order("id " + in.OrderBy).Find(&list) return list, count } func MyReadApprovals(in *approval.ListRequest) ([]*Approval, int64) { var list []*Approval var count int64 //list modelObj := DB.Model(&Approval{}). Preload("Show"). Preload("Work.ApprovalWorks"). Preload("Bundle"). Preload("BundlePayPrice"). Preload("ApprovalWorkFlows"). Preload("ExhibitionReward.ApprovalExhibitions"). Preload("ApprovalType.ApprovalTypeGroup"). Preload("Exhibition.ApprovalExhibitions"). Preload("FinancialForm"). Preload("ApprovalOA") if in.Type != "" { modelObj = modelObj.Where(&Approval{Type: in.Type}) } //modelObj = modelObj.Where(&Approval{SubmitterID: in.UserID}) if in.SubmitterName != "" { modelObj = modelObj.Where("submitter_name = ? ", in.SubmitterName) } if in.StartTime != "" && in.EndTime != "" { modelObj = modelObj.Where(" created_at between ? and ? ", in.StartTime, in.EndTime) } modelObj.Where(" status = 2 and json_contains(copy_users,JSON_OBJECT('ID', ?))", in.UserID) modelObj.Count(&count) modelObj.Limit(int(in.PageSize)).Offset(page.GetOffset(in.Page, in.PageSize)).Order("id " + in.OrderBy).Find(&list) return list, count } func (m *Approval) Pass(reply string, workFlowId uint64) error { return m.operateStatus(StatusOk, reply, workFlowId) } func (m *Approval) Refuse(reply string, workFlowId uint64) error { return m.operateStatus(StatusFail, reply, workFlowId) } func (m *Approval) operateStatus(status uint8, reply string, workFlowId uint64) error { var workFlow ApprovalWorkFlow m.Reply = reply if err := DB.Model(&ApprovalWorkFlow{ApprovalID: m.ID, Status: StatusDoing}).First(&workFlow, workFlowId).Error; err != nil { return err } if m.NowLevel != workFlow.Level { return errors.New(msg.ErrorOperate) } // 拒绝通过 if status == StatusFail { m.Status = StatusFail if err := DB.Save(m).Error; err != nil { return err } return workFlow.Refuse(reply) } /*--------层级审批通过---------*/ // 整个审批通过 if m.Level == m.NowLevel { m.Status = StatusOk //审批层级通过 } else { m.NowLevel = workFlow.Level + 1 nextFlow, err := GetWorkFlowByLevel(m.ID, m.NowLevel) if err != nil { return err } m.NowUserId = nextFlow.UserId m.NowUserName = nextFlow.Name } if err := DB.Save(m).Error; err != nil { return err } return workFlow.Pass(reply) } func UpdateLeaveBalance(p *Approval, leaveBalance string) error { if leaveBalance == "" { return nil } approvalOA := new(ApprovalOA) err := DB.Model(&ApprovalOA{}).Where("approval_id = ?", p.ID).Find(&approvalOA).Error if err != nil { return err } copier.CopyWithOption(&approvalOA, p.ApprovalOA, copier.Option{DeepCopy: true}) balance, _ := strconv.ParseFloat(leaveBalance, 10) approvalOA.LeaveApply.LeaveBalance = float32(balance) fmt.Println("============== 更新 余额申请 余额 ========== 开始 =========") fmt.Printf("approval info is : %+v\n", p) fmt.Printf("approval_oa info is : %+v\n", approvalOA) fmt.Println("============== 更新 余额申请 余额 ========== 结束 =========") //return DB.Model(&ApprovalOA{}).Where("id = ?", approvalOA.ID).Updates(map[string]interface{}{"leave_apply": approvalOA.LeaveApply}).Error return DB.Model(&ApprovalOA{}).Where("id = ?", approvalOA.ID).Updates(approvalOA).Error } func getApprovalContentFactory(typeFiled string) (ApprovalContentInterface, error) { switch typeFiled { case TypeContent: return &Approval{}, nil case TypeShow: return &Show{}, nil case TypeWork: return &Work{}, nil case TypeBundle: return &Bundle{}, nil case TypeExhibition: return &Exhibition{}, nil case TypeBundlePayPrice: return &BundlePayPrice{}, nil case TypeArtExhibitionReward: return &ExhibitionReward{}, nil case TypeFinancialForm: return &FinancialForm{}, nil default: if TypeMap[typeFiled] == TypeOa { return &ApprovalOA{}, nil } else { return &Approval{}, nil } } }