package model
import (
"database/sql/driver"
"encoding/json"
"errors"
"fmt"
"github.com/fonchain_enterprise/fonchain-approval/api/approval"
"github.com/fonchain_enterprise/fonchain-approval/pkg/common/page"
msg "github.com/fonchain_enterprise/fonchain-approval/pkg/m"
"github.com/jinzhu/copier"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"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" ) .
Preload ( "ApprovalOA" )
fmt . Println ( "list request :==================== start ===================" )
fmt . Println ( " value " , in )
fmt . Println ( "list request :==================== end ===================" )
//我未阅读的和我未操作的
queryApproval := & Approval { NowUserId : in . UserID }
if in . SubmitterName != "" {
queryApproval . SubmitterName = in . SubmitterName
} else {
if in . ApprovalStatus == 0 {
queryApproval . Status = StatusDoing
}
}
//if in.ApprovalStatus == 0 && in.SubmitterName == "" { // 此处 为 阅读状态 表示 审批状态 默认为 StatusDoing
// queryApproval.Status = StatusDoing
//}
if in . ApprovalStatus <= StatusFail && in . ApprovalStatus > 0 { // 具体 的 审批状态
queryApproval . Status = int8 ( in . ApprovalStatus )
}
queryApprovalCopy := & ApprovalCopy { UserId : in . UserID }
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 ) . Select ( "approval_id" )
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 ) ) ) // 已完成,抄送给我的
} else {
modelObj = modelObj . Where ( & Approval { Type : in . Type } ) . Where (
DB . Where ( & Approval { SubmitterName : in . SubmitterName , Status : queryApproval . Status } ) . Or ( DB . Where ( "now_user_id = ?" , in . UserID ) ) . Or ( DB . Where ( "id in (?)" , s1 ) ) )
}
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})
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
}
}
}