You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

967 lines
27 KiB
Go

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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
}
}
}