2022-07-28 09:18:01 +00:00
package model
import (
2023-01-16 08:09:19 +00:00
"database/sql/driver"
"encoding/json"
2022-07-28 09:18:01 +00:00
"errors"
2022-10-14 08:48:45 +00:00
"fmt"
2022-07-28 09:18:01 +00:00
"github.com/fonchain_enterprise/fonchain-approval/api/approval"
2022-08-12 05:24:33 +00:00
"github.com/fonchain_enterprise/fonchain-approval/pkg/common/page"
2022-08-16 10:45:28 +00:00
msg "github.com/fonchain_enterprise/fonchain-approval/pkg/m"
2023-05-29 06:24:00 +00:00
"github.com/jinzhu/copier"
2022-07-28 09:18:01 +00:00
"gorm.io/gorm"
2023-03-18 08:35:55 +00:00
"gorm.io/gorm/clause"
2022-07-28 09:18:01 +00:00
"gorm.io/plugin/soft_delete"
2023-05-29 05:06:24 +00:00
"strconv"
2022-07-28 09:18:01 +00:00
"time"
)
2023-01-16 08:09:19 +00:00
type KeyInfo struct {
ApprovalKey string
ApprovalName string
ApprovalType string
ApprovalValue string
2023-03-01 10:53:47 +00:00
ApprovalMark bool
2023-01-16 08:09:19 +00:00
}
type KeyInfos [ ] KeyInfo
2022-07-28 09:18:01 +00:00
// Approval 审批
type Approval struct {
2022-08-16 10:45:28 +00:00
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" `
2023-01-16 08:09:19 +00:00
ValueJson KeyInfos ` gorm:"type:json;column:value_json;default:null;comment:自定义信息" json:"valueJson" `
2022-08-16 10:45:28 +00:00
Reply string ` gorm:"column:reply" json:"reply" `
Domain * string ` gorm:"column:domain" json:"domain" `
Show * Show ` gorm:"foreignKey:ApprovalID" json:"Show" `
2023-03-01 10:53:47 +00:00
ApprovalType * ApprovalType ` gorm:"foreignKey:KeyWord;references:Type" json:"approvalType" ` // type类型
2022-08-16 10:45:28 +00:00
Work * Work ` gorm:"foreignKey:ApprovalID" json:"Work" `
Bundle * Bundle ` gorm:"foreignKey:ApprovalID" json:"Bundle" `
Exhibition * Exhibition ` gorm:"foreignKey:ApprovalID" json:"Exhibition" `
2023-03-20 10:26:13 +00:00
BundlePayPrice * BundlePayPrice ` gorm:"foreignKey:ApprovalID" json:"BundlePayPrice" ` //关联的type
ExhibitionReward * ExhibitionReward ` gorm:"foreignKey:ApprovalID" json:"ExhibitionReward" ` //关联的type
2022-08-16 10:45:28 +00:00
ApprovalWorkFlows [ ] * ApprovalWorkFlow ` gorm:"foreignKey:ApprovalID" json:"ApprovalWorkFlows" `
2023-05-04 02:15:50 +00:00
ApprovalOA * ApprovalOA ` gorm:"foreignKey:ApprovalID" json:"oa" `
2023-04-25 06:42:24 +00:00
FinancialForm * FinancialForm ` gorm:"foreignKey:ApprovalID" json:"financialForm" `
2022-07-28 09:18:01 +00:00
}
2023-01-16 08:09:19 +00:00
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
}
2022-07-28 09:18:01 +00:00
const (
2023-03-18 08:35:55 +00:00
TypeContent = "content"
TypeWork = "work"
TypeExhibition = "exhibition"
TypeShow = "show"
TypeBundle = "bundle"
TypeBundlePayPrice = "bundlePayPrice"
TypeArtExhibitionReward = "artExhibitionReward"
2023-05-04 02:43:48 +00:00
TypeOa = "oa" // oa 父类
2023-05-22 07:25:45 +00:00
TypeMakeUp = "makeUp"
2023-05-04 02:43:48 +00:00
TypeFinancialForm = "financialFormApply"
2022-07-28 09:18:01 +00:00
)
2022-07-29 07:40:30 +00:00
const (
2022-08-18 05:26:14 +00:00
StatusDoing = 1
StatusOk = 2
StatusFail = 3
)
const (
StatusNeedViewed = 4
StatusViewed = 5
2022-07-29 07:40:30 +00:00
)
2022-07-28 09:18:01 +00:00
type ApprovalContentInterface interface {
2023-03-20 10:26:13 +00:00
GetApproval ( id uint64 ) ( * Approval , error )
2022-07-29 09:08:00 +00:00
SaveApprovalContent ( in * approval . CreateRequest , a * Approval ) error
UpdateApprovalContent ( in * approval . CreateRequest , a * Approval ) error
BuildResContent ( a * Approval , request * approval . CreateRequest )
2022-07-28 09:18:01 +00:00
DeleteApproval ( p * Approval ) error
}
// TableName get sql table name.获取数据库表名
func ( m * Approval ) TableName ( ) string {
return "approval"
}
2022-10-14 08:48:45 +00:00
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
}
/ *
2022-08-18 05:26:14 +00:00
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
}
2022-10-14 08:48:45 +00:00
* /
// 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 != ?
2023-02-03 08:15:21 +00:00
AND approval . domain = ? AND approval . submitter_id = ? AND approval . type = ? AND approval . deleted_at = 0 `
2022-10-14 08:48:45 +00:00
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 = ?
2023-02-03 08:15:21 +00:00
AND approval . domain = ? AND approval . submitter_id = ? AND approval . type = ? AND approval . deleted_at = 0 `
2022-10-14 08:48:45 +00:00
DB . Raw ( str1 , StatusOk , domain , submitterID , TypeBundle ) . Scan ( & total )
fmt . Println ( "所有申请的" , total )
return total - usedNum
}
2022-08-18 05:26:14 +00:00
2023-03-27 06:57:26 +00:00
func ExistPayApproval ( in * approval . CreateRequest ) bool {
var count int64
//
subQuery1 := DB . Model ( & Approval { } ) . Where ( & Approval { SubmitterID : in . SubmitterID , Type : TypeBundlePayPrice } ) .
2023-04-13 10:33:11 +00:00
Where ( "status in (?)" , [ ] uint64 { StatusDoing , StatusOk } ) .
2023-03-27 06:57:26 +00:00
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
}
2023-05-18 08:13:28 +00:00
// 余额申请 校验
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 {
2023-05-18 10:32:17 +00:00
subQuery1 . Where ( " date_format(created_at,'%Y') = ?" , time . Now ( ) . Format ( "2006" ) )
2023-05-18 08:13:28 +00:00
}
subQuery1 . Select ( "id" )
DB . Model ( & ApprovalOA { } ) . Where ( "approval_id in (?)" , subQuery1 ) . Count ( & count )
if count >= 1 {
return true
}
return false
}
2023-05-22 07:25:45 +00:00
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
}
2022-07-29 09:08:00 +00:00
func StoreApproval ( in * approval . CreateRequest ) ( * Approval , error ) {
2022-07-28 09:18:01 +00:00
var entity * Approval
2022-08-18 05:26:14 +00:00
if err1 := preValidateExhibition ( in ) ; err1 != nil {
return entity , err1
}
2023-03-24 07:03:38 +00:00
fmt . Println ( "------------t1----------" )
2022-07-28 09:18:01 +00:00
err := DB . Transaction ( func ( tx * gorm . DB ) error {
2023-03-24 07:03:38 +00:00
fmt . Println ( "------------t2----------" )
2022-08-16 10:45:28 +00:00
setting , terr := GetApprovalSettingFromKeyWord ( in . Domain , in . Type )
2023-02-03 08:15:21 +00:00
fmt . Println ( "1-----" , terr , setting )
2023-01-16 08:09:19 +00:00
2023-02-03 08:15:21 +00:00
if terr != nil || setting == nil {
2023-03-18 08:35:55 +00:00
return errors . New ( "审批人员没有配置" )
2022-08-16 10:45:28 +00:00
}
2023-03-24 07:03:38 +00:00
fmt . Println ( "------------t3----------" )
2023-02-03 08:15:21 +00:00
approvalUsers := setting . GetCombineApproveUsers ( FormatApproveUsers ( in . ApprovalUsers ) )
fmt . Println ( "2-----" , approvalUsers )
2022-07-28 09:18:01 +00:00
// 保存基本信息
entity = & Approval {
2022-07-29 07:40:30 +00:00
Domain : & in . Domain ,
SubmitterID : in . SubmitterID ,
2022-07-28 09:18:01 +00:00
SubmitterName : in . SubmitterName ,
2022-08-16 10:45:28 +00:00
CopyUsers : setting . CopyUsers ,
2023-02-01 05:18:09 +00:00
ApprovalUsers : approvalUsers ,
2022-07-28 09:18:01 +00:00
Type : in . Type ,
Content : in . Content ,
2023-01-16 08:09:19 +00:00
ValueJson : ToKeyInfos ( in . CustomizeInfo ) ,
2022-08-18 05:26:14 +00:00
Status : StatusDoing ,
2023-02-01 05:18:09 +00:00
Level : uint8 ( len ( approvalUsers ) ) ,
2022-08-16 10:45:28 +00:00
NowLevel : 1 ,
2023-02-01 05:18:09 +00:00
NowUserId : approvalUsers [ 0 ] . ID ,
NowUserName : approvalUsers [ 0 ] . Name ,
2022-07-28 09:18:01 +00:00
}
2023-01-16 08:09:19 +00:00
fmt . Println ( 3 )
2023-03-01 10:53:47 +00:00
fmt . Println ( entity )
2022-07-28 09:18:01 +00:00
if err := DB . Create ( & entity ) . Error ; err != nil {
return err
}
// 不同类型保存不同的结构体
2023-01-16 08:09:19 +00:00
fmt . Println ( 41 , entity )
2022-07-28 09:18:01 +00:00
err := entity . SaveContent ( in )
2023-01-16 08:09:19 +00:00
fmt . Println ( 4 )
2022-08-16 10:45:28 +00:00
if err != nil {
return err
}
2023-01-16 08:09:19 +00:00
fmt . Println ( 5 )
2023-03-18 08:35:55 +00:00
err = BatchSave ( approvalUsers , entity . ID )
if err != nil {
return err
}
2023-03-20 10:26:13 +00:00
2023-03-18 08:35:55 +00:00
return BatchCopySave ( setting . CopyUsers , entity . ID )
2022-07-28 09:18:01 +00:00
} )
2023-02-03 08:15:21 +00:00
//fmt.Println("nil", entity)
//fmt.Println("nil", entity.ID)
2022-07-28 09:18:01 +00:00
return entity , err
}
2022-07-29 07:40:30 +00:00
func Viewed ( in * approval . ViewedRequest ) error {
var entity * Approval
var err error
2022-08-18 05:26:14 +00:00
var isView = false
2022-07-29 07:40:30 +00:00
if err = DB . First ( & entity , in . ID ) . Error ; err != nil {
2022-08-16 10:45:28 +00:00
return errors . New ( msg . ErrorNotFound )
2022-07-29 07:40:30 +00:00
}
2022-08-18 05:26:14 +00:00
if entity . Status != StatusOk {
return errors . New ( msg . ErrorDoingNotView )
}
2022-07-29 07:40:30 +00:00
copyUsers := entity . CopyUsers
for i , temp := range copyUsers {
if temp . ID == in . UserID {
2022-08-18 05:26:14 +00:00
if temp . IsViewed == true {
return errors . New ( msg . ErrorAlreadySettingView )
}
isView = true
temp . IsViewed = isView
2022-07-29 07:40:30 +00:00
copyUsers [ i ] = temp
}
}
2022-08-18 05:26:14 +00:00
if isView == false {
return errors . New ( msg . ErrorSettingView )
}
2023-03-18 08:35:55 +00:00
err = DB . Model ( & Approval { } ) . Where ( & Approval { ID : in . ID } ) . Updates ( & Approval { CopyUsers : copyUsers } ) . Error
if err != nil {
return err
}
2022-08-18 05:26:14 +00:00
2023-03-18 08:35:55 +00:00
DB . Model ( & ApprovalCopy { } ) . Where ( & ApprovalCopy { ApprovalID : in . ID , UserId : in . UserID } ) . Updates ( & ApprovalCopy { Status : StatusOk } )
return err
2022-07-29 07:40:30 +00:00
}
2022-07-29 09:08:00 +00:00
func UpdateApproval ( in * approval . CreateRequest ) ( * Approval , error ) {
2022-07-29 07:40:30 +00:00
var entity * Approval
2022-08-18 05:26:14 +00:00
if err1 := preValidateExhibition ( in ) ; err1 != nil {
return entity , err1
}
2022-07-29 07:40:30 +00:00
err := DB . Transaction ( func ( tx * gorm . DB ) error {
if departErr := DB . First ( & entity , in . ID ) . Error ; departErr != nil {
2022-08-16 10:45:28 +00:00
return errors . New ( msg . ErrorNotFound )
2022-07-29 07:40:30 +00:00
}
2022-07-30 03:41:22 +00:00
if entity . Type != in . Type {
2022-08-16 10:45:28 +00:00
return errors . New ( msg . ErrorChangeType )
2022-07-30 03:41:22 +00:00
}
2022-07-29 07:40:30 +00:00
// 保存基本信息
2022-08-25 07:53:38 +00:00
upEntity := & Approval {
2022-07-29 07:40:30 +00:00
Content : in . Content ,
}
2023-01-16 08:09:19 +00:00
if entity . Status == StatusFail {
upEntity . Status = StatusDoing
}
2022-08-25 07:53:38 +00:00
if err := DB . Where ( & Approval { ID : in . ID } ) . Updates ( & upEntity ) . Error ; err != nil {
2022-07-29 07:40:30 +00:00
return err
}
// 不同类型保存不同的结构体
err := entity . UpdateContent ( in )
return err
} )
return entity , err
}
func approvalCalc ( filter * Approval ) * approval . Information {
var num int64
2022-07-30 05:11:18 +00:00
info := & approval . Information {
Total : 0 ,
DoingTotal : 0 ,
SuccessTotal : 0 ,
FailTotal : 0 ,
}
2022-07-29 07:40:30 +00:00
DB . Model ( & Approval { } ) . Where ( & filter ) . Count ( & num )
info . Total = uint64 ( num )
2022-08-18 05:26:14 +00:00
DB . Model ( & Approval { } ) . Where ( & filter ) . Where ( & Approval { Status : StatusDoing } ) . Count ( & num )
2022-07-29 07:40:30 +00:00
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
}
2023-03-01 10:53:47 +00:00
func approvalCalcJsonV2 ( domain string , userId uint64 ) * approval . Information {
var num int64
2023-03-18 08:35:55 +00:00
var jsonStr = "json_contains(approval_users,json_object('ID', ?))"
2023-03-01 10:53:47 +00:00
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
}
2022-08-16 10:45:28 +00:00
func approvalCalcJson ( domain string , userId uint64 ) * approval . Information {
var num int64
2022-08-18 05:26:14 +00:00
var jsonStr = "JSON_CONTAINS(approval_users,JSON_OBJECT('ID', ?))"
2022-08-16 10:45:28 +00:00
info := & approval . Information {
Total : 0 ,
DoingTotal : 0 ,
SuccessTotal : 0 ,
FailTotal : 0 ,
}
DB . Model ( & Approval { } ) . Where ( jsonStr , userId ) . Count ( & num )
info . Total = uint64 ( num )
2022-08-18 05:26:14 +00:00
DB . Model ( & Approval { } ) . Where ( jsonStr , userId ) . Where ( & Approval { Status : StatusDoing , Domain : & domain } ) . Count ( & num )
2022-08-16 10:45:28 +00:00
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
}
2022-07-29 07:40:30 +00:00
// ApprovalInfo 统计
func ApprovalInfo ( in * approval . InformationRequest ) ( * approval . InformationResponse , error ) {
response := & approval . InformationResponse {
MySubmitInfo : approvalCalc ( & Approval { Domain : & in . Domain , SubmitterID : in . UserID } ) ,
2023-03-01 10:53:47 +00:00
SubmitMeInfo : approvalCalcJsonV2 ( in . Domain , in . UserID ) ,
2022-07-29 07:40:30 +00:00
DomainInfo : approvalCalc ( & Approval { Domain : & in . Domain } ) ,
}
return response , nil
}
2023-03-20 10:26:13 +00:00
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
}
2022-07-29 09:08:00 +00:00
func ( m * Approval ) SaveApprovalContent ( in * approval . CreateRequest , a * Approval ) error {
2022-07-28 09:18:01 +00:00
return nil
}
2022-07-29 09:08:00 +00:00
func ( m * Approval ) UpdateApprovalContent ( in * approval . CreateRequest , a * Approval ) error {
2022-07-29 07:40:30 +00:00
return nil
}
2022-07-28 09:18:01 +00:00
func ( m * Approval ) DeleteApproval ( p * Approval ) error {
return nil
}
func ( m * Approval ) DeleteContent ( ) error {
2022-08-16 10:45:28 +00:00
factory , err := getApprovalContentFactory ( m . Type )
2022-07-28 09:18:01 +00:00
if err != nil {
return err
}
return factory . DeleteApproval ( m )
}
2022-07-29 09:08:00 +00:00
func ( m * Approval ) BuildResContent ( a * Approval , request * approval . CreateRequest ) {
2022-07-28 09:18:01 +00:00
}
2022-07-29 09:08:00 +00:00
func ( m * Approval ) SetResContent ( request * approval . CreateRequest ) error {
2022-07-28 09:18:01 +00:00
2023-03-20 10:26:13 +00:00
fmt . Println ( m . Type )
2022-08-16 10:45:28 +00:00
factory , err := getApprovalContentFactory ( m . Type )
2022-07-28 09:18:01 +00:00
2023-03-20 10:26:13 +00:00
fmt . Println ( factory , err )
2022-07-28 09:18:01 +00:00
if err != nil {
return err
}
2023-03-20 10:26:13 +00:00
fmt . Println ( "开始执行" )
2022-07-28 09:18:01 +00:00
factory . BuildResContent ( m , request )
return nil
}
2022-07-29 09:08:00 +00:00
func ( m * Approval ) SaveContent ( in * approval . CreateRequest ) error {
2022-07-28 09:18:01 +00:00
2022-08-16 10:45:28 +00:00
factory , err := getApprovalContentFactory ( in . Type )
2022-07-28 09:18:01 +00:00
if err != nil {
return err
}
err = factory . SaveApprovalContent ( in , m )
return err
}
2022-07-29 09:08:00 +00:00
func ( m * Approval ) UpdateContent ( in * approval . CreateRequest ) error {
2022-07-29 07:40:30 +00:00
2022-08-16 10:45:28 +00:00
factory , err := getApprovalContentFactory ( in . Type )
2022-07-29 07:40:30 +00:00
if err != nil {
return err
}
err = factory . UpdateApprovalContent ( in , m )
return err
}
2023-03-18 08:35:55 +00:00
//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" ) .
2023-03-20 10:26:13 +00:00
Preload ( "ExhibitionReward.ApprovalExhibitions" ) .
2023-03-18 08:35:55 +00:00
Preload ( "ApprovalWorkFlows" ) .
2023-04-25 03:07:00 +00:00
Preload ( "Exhibition.ApprovalExhibitions" ) .
2023-05-08 02:52:00 +00:00
Preload ( "FinancialForm" ) .
Preload ( "ApprovalOA" )
2023-03-18 08:35:55 +00:00
2023-06-13 09:56:21 +00:00
fmt . Println ( "list request :==================== start ===================" )
fmt . Println ( " value " , in )
fmt . Println ( "list request :==================== end ===================" )
2023-03-18 08:35:55 +00:00
//我未阅读的和我未操作的
2023-06-13 08:46:07 +00:00
queryApproval := & Approval { NowUserId : in . UserID }
2023-06-13 08:55:25 +00:00
if in . SubmitterName != "" {
queryApproval . SubmitterName = in . SubmitterName
} else {
if in . ApprovalStatus == 0 {
queryApproval . Status = StatusDoing
}
2023-06-13 08:46:07 +00:00
}
2023-06-13 08:55:25 +00:00
//if in.ApprovalStatus == 0 && in.SubmitterName == "" { // 此处 为 阅读状态 表示 审批状态 默认为 StatusDoing
// queryApproval.Status = StatusDoing
//}
2023-06-13 08:46:07 +00:00
if in . ApprovalStatus <= StatusFail && in . ApprovalStatus > 0 { // 具体 的 审批状态
2023-06-13 03:46:35 +00:00
queryApproval . Status = int8 ( in . ApprovalStatus )
}
2023-06-13 08:46:07 +00:00
2023-06-13 03:46:35 +00:00
queryApprovalCopy := & ApprovalCopy { UserId : in . UserID }
2023-06-13 08:46:07 +00:00
if in . ApprovalStatus > StatusFail { // 具体 的 阅读状态
2023-06-13 03:46:35 +00:00
if in . ApprovalStatus == 4 {
2023-06-13 09:12:36 +00:00
queryApprovalCopy . Status = 1
2023-06-13 03:46:35 +00:00
} else if in . ApprovalStatus == 5 {
2023-06-13 09:12:36 +00:00
queryApprovalCopy . Status = 2
2023-06-13 03:46:35 +00:00
}
2023-06-13 08:46:07 +00:00
queryApproval . Status = StatusOk // 此处 为 阅读状态 表示 审批状态 为 StatusOk
2023-06-13 03:46:35 +00:00
}
2023-06-13 08:46:07 +00:00
DB . Model ( & Approval { } ) . Where ( & Approval { Type : in . Type } ) . Where ( queryApproval ) . Order ( "id " + in . OrderBy ) . Select ( "id" ) . Find ( & ids )
2023-06-13 11:26:59 +00:00
s1 := DB . Model ( & ApprovalCopy { } ) . Where ( queryApprovalCopy ) . Select ( "approval_id" )
2023-03-18 08:35:55 +00:00
2023-06-13 06:53:34 +00:00
if in . StartTime != "" && in . EndTime != "" {
modelObj = modelObj . Where ( " created_at between ? and ? " , in . StartTime , in . EndTime )
}
2023-06-13 10:01:57 +00:00
fmt . Println ( "queryApproval request :==================== start ===================" )
2023-06-13 10:13:26 +00:00
fmt . Printf ( "queryApproval %+v\n" , queryApproval )
2023-06-13 10:01:57 +00:00
fmt . Println ( "queryApproval request :==================== end ===================" )
2023-06-13 06:53:34 +00:00
2023-06-13 10:27:44 +00:00
if in . SubmitterName == "" && in . ApprovalStatus == 0 {
2023-06-13 09:04:14 +00:00
modelObj = modelObj . Where ( & Approval { Type : in . Type } ) . Where (
DB . Where ( & Approval { NowUserId : in . UserID , Status : StatusDoing } ) . // 我需要审批的
2023-06-13 11:26:59 +00:00
Or ( DB . Where ( "status = ?" , StatusOk ) . Where ( "id in (?)" , s1 ) ) ) // 已完成,抄送给我的
2023-06-13 09:04:14 +00:00
} else {
modelObj = modelObj . Where ( & Approval { Type : in . Type } ) . Where (
2023-06-13 11:26:59 +00:00
DB . Where ( & Approval { SubmitterName : in . SubmitterName , Status : queryApproval . Status } ) . Or ( DB . Where ( "now_user_id = ?" , in . UserID ) ) . Or ( DB . Where ( "id in (?)" , s1 ) ) )
2023-06-13 09:04:14 +00:00
}
2023-06-13 06:40:39 +00:00
2023-03-18 08:35:55 +00:00
modelObj . Count ( & count )
if len ( ids ) > 0 { //根据具体id排序
modelObj = modelObj . Clauses ( clause . OrderBy {
2023-06-13 03:46:35 +00:00
Expression : clause . Expr { SQL : "FIELD(id,?) " + in . OrderBy , Vars : [ ] interface { } { ids } , WithoutParentheses : true } ,
2023-03-18 08:35:55 +00:00
} )
} else {
2023-06-13 03:46:35 +00:00
modelObj = modelObj . Order ( "id " + in . OrderBy )
2023-03-18 08:35:55 +00:00
}
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" ) .
2023-04-25 03:07:00 +00:00
Preload ( "Exhibition.ApprovalExhibitions" ) .
2023-05-08 02:52:00 +00:00
Preload ( "FinancialForm" ) .
Preload ( "ApprovalOA" )
2023-03-18 08:35:55 +00:00
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 ) .
2023-06-13 10:01:57 +00:00
Where ( "status != ?" , StatusDoing ) . //完成,我参与审批
Or ( DB . Where ( "now_user_id" , in . UserID ) . Where ( "status = ?" , StatusDoing ) ) . //进行中,当前审批人是我,
2023-03-18 08:35:55 +00:00
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 )
2023-06-13 03:46:35 +00:00
modelObj . Order ( "id " + in . OrderBy ) . Limit ( int ( in . PageSize ) ) . Offset ( page . GetOffset ( in . Page , in . PageSize ) ) . Find ( & list )
2023-03-18 08:35:55 +00:00
return list , count
}
2022-08-18 05:26:14 +00:00
func MyWorkApprovals ( in * approval . ListRequest ) ( [ ] * Approval , int64 ) {
2022-07-28 09:18:01 +00:00
var list [ ] * Approval
var count int64
//list
2022-07-30 03:41:22 +00:00
modelObj := DB . Model ( & Approval { } ) .
Preload ( "Show" ) .
Preload ( "Work.ApprovalWorks" ) .
Preload ( "Bundle" ) .
2023-03-18 08:35:55 +00:00
Preload ( "ApprovalType" ) .
Preload ( "BundlePayPrice" ) .
2023-03-01 10:53:47 +00:00
Preload ( "ApprovalType.ApprovalTypeGroup" ) .
2023-03-20 10:26:13 +00:00
Preload ( "ExhibitionReward.ApprovalExhibitions" ) .
2022-08-16 10:45:28 +00:00
Preload ( "ApprovalWorkFlows" ) .
2023-04-25 03:07:00 +00:00
Preload ( "Exhibition.ApprovalExhibitions" ) .
2023-05-08 02:52:00 +00:00
Preload ( "FinancialForm" ) .
Preload ( "ApprovalOA" )
2022-07-28 09:18:01 +00:00
if in . Type != "" {
modelObj = modelObj . Where ( & Approval { Type : in . Type } )
}
2023-06-13 03:46:35 +00:00
if in . SubmitterName != "" {
modelObj = modelObj . Where ( & Approval { SubmitterName : in . SubmitterName } )
}
2023-06-13 05:18:58 +00:00
if in . StartTime != "" && in . EndTime != "" {
modelObj = modelObj . Where ( " created_at between ? and ? " , in . StartTime , in . EndTime )
}
2022-08-27 03:54:59 +00:00
/ * *
* 审批展示 ( 抄送在此不表 )
/ \
进行中 通过或者拒绝
/ \
当前是我审批 我参与审批的
* /
2022-08-04 03:07:55 +00:00
if in . UserID != 0 {
2022-08-27 03:54:59 +00:00
modelObj = modelObj . Where (
DB . Where ( "JSON_CONTAINS(approval_users,JSON_OBJECT('ID', ?))" , in . UserID ) .
2023-06-13 10:01:57 +00:00
Where ( "status != ?" , StatusDoing ) . //完成,我参与审批
Or ( DB . Where ( "now_user_id" , in . UserID ) . Where ( "status = ?" , StatusDoing ) ) . //进行中,当前审批人是我,
2022-08-27 03:54:59 +00:00
Or ( DB . Where ( "JSON_CONTAINS(copy_users,JSON_OBJECT('ID', ?))" , in . UserID ) . Where ( "status = ?" , StatusOk ) ) ) //抄送人(完成抄送)
2022-07-30 08:44:54 +00:00
}
2023-03-01 10:53:47 +00:00
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 )
}
2022-07-28 09:18:01 +00:00
if in . Status != 0 {
modelObj = modelObj . Where ( & Approval { Status : int8 ( in . Status ) } )
}
modelObj . Count ( & count )
2023-06-13 03:46:35 +00:00
modelObj . Order ( "id " + in . OrderBy ) . Limit ( int ( in . PageSize ) ) . Offset ( page . GetOffset ( in . Page , in . PageSize ) ) . Find ( & list )
2022-07-28 09:18:01 +00:00
return list , count
}
2022-08-18 05:26:14 +00:00
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" ) .
2023-03-18 08:35:55 +00:00
Preload ( "BundlePayPrice" ) .
2022-08-18 05:26:14 +00:00
Preload ( "ApprovalWorkFlows" ) .
2023-03-20 10:26:13 +00:00
Preload ( "ExhibitionReward.ApprovalExhibitions" ) .
2023-03-01 10:53:47 +00:00
Preload ( "ApprovalType.ApprovalTypeGroup" ) .
2023-04-25 03:07:00 +00:00
Preload ( "Exhibition.ApprovalExhibitions" ) .
2023-05-08 02:52:00 +00:00
Preload ( "FinancialForm" ) .
Preload ( "ApprovalOA" )
2022-08-18 05:26:14 +00:00
if in . Status != 0 {
2023-04-13 12:08:55 +00:00
modelObj = modelObj . Where ( & Approval { Status : int8 ( in . Status ) } )
}
if in . Type != "" {
modelObj = modelObj . Where ( & Approval { Type : in . Type } )
2022-08-18 05:26:14 +00:00
}
2023-04-13 12:08:55 +00:00
modelObj = modelObj . Where ( & Approval { SubmitterID : in . UserID } )
modelObj . Count ( & count )
2023-06-13 03:46:35 +00:00
modelObj . Limit ( int ( in . PageSize ) ) . Offset ( page . GetOffset ( in . Page , in . PageSize ) ) . Order ( "id " + in . OrderBy ) . Find ( & list )
2023-04-13 12:08:55 +00:00
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" ) .
2023-04-25 03:07:00 +00:00
Preload ( "Exhibition.ApprovalExhibitions" ) .
2023-05-08 02:52:00 +00:00
Preload ( "FinancialForm" ) .
Preload ( "ApprovalOA" )
2023-04-13 12:08:55 +00:00
2022-08-18 05:26:14 +00:00
if in . Type != "" {
2023-04-13 10:42:21 +00:00
modelObj = modelObj . Where ( & Approval { Type : in . Type } )
2022-08-18 05:26:14 +00:00
}
2023-04-14 01:02:56 +00:00
//modelObj = modelObj.Where(&Approval{SubmitterID: in.UserID})
2022-08-18 05:26:14 +00:00
2023-04-14 01:26:09 +00:00
modelObj . Where ( " status = 2 and json_contains(copy_users,JSON_OBJECT('ID', ?))" , in . UserID )
2023-04-13 12:14:58 +00:00
2022-08-18 05:26:14 +00:00
modelObj . Count ( & count )
2023-06-13 03:46:35 +00:00
modelObj . Limit ( int ( in . PageSize ) ) . Offset ( page . GetOffset ( in . Page , in . PageSize ) ) . Order ( "id " + in . OrderBy ) . Find ( & list )
2022-08-18 05:26:14 +00:00
return list , count
}
2022-08-16 10:45:28 +00:00
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
2022-08-18 05:26:14 +00:00
m . Reply = reply
2022-08-16 10:45:28 +00:00
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 )
}
2022-08-18 05:26:14 +00:00
// 拒绝通过
if status == StatusFail {
2022-08-16 10:45:28 +00:00
m . Status = StatusFail
if err := DB . Save ( m ) . Error ; err != nil {
return err
}
return workFlow . Refuse ( reply )
}
2022-08-18 05:26:14 +00:00
/*--------层级审批通过---------*/
// 整个审批通过
if m . Level == m . NowLevel {
2022-08-16 10:45:28 +00:00
m . Status = StatusOk
2022-08-18 05:26:14 +00:00
//审批层级通过
} else {
2022-08-16 10:45:28 +00:00
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 )
}
2023-05-29 05:06:24 +00:00
func UpdateLeaveBalance ( p * Approval , leaveBalance string ) error {
if leaveBalance == "" {
return nil
}
approvalOA := new ( ApprovalOA )
2023-05-29 05:34:35 +00:00
err := DB . Model ( & ApprovalOA { } ) . Where ( "approval_id = ?" , p . ID ) . Find ( & approvalOA ) . Error
if err != nil {
return err
}
2023-05-29 06:24:00 +00:00
copier . CopyWithOption ( & approvalOA , p . ApprovalOA , copier . Option { DeepCopy : true } )
2023-05-29 05:06:24 +00:00
balance , _ := strconv . ParseFloat ( leaveBalance , 10 )
2023-05-29 06:24:00 +00:00
approvalOA . LeaveApply . LeaveBalance = float32 ( balance )
2023-05-29 05:06:24 +00:00
fmt . Println ( "============== 更新 余额申请 余额 ========== 开始 =========" )
fmt . Printf ( "approval info is : %+v\n" , p )
fmt . Printf ( "approval_oa info is : %+v\n" , approvalOA )
fmt . Println ( "============== 更新 余额申请 余额 ========== 结束 =========" )
2023-05-29 06:24:00 +00:00
//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
2023-05-29 05:06:24 +00:00
}
2022-08-16 10:45:28 +00:00
func getApprovalContentFactory ( typeFiled string ) ( ApprovalContentInterface , error ) {
2022-07-28 09:18:01 +00:00
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
2023-03-01 10:53:47 +00:00
case TypeBundlePayPrice :
return & BundlePayPrice { } , nil
2023-03-20 10:26:13 +00:00
case TypeArtExhibitionReward :
return & ExhibitionReward { } , nil
2023-04-25 03:07:00 +00:00
case TypeFinancialForm :
2023-04-25 06:15:05 +00:00
return & FinancialForm { } , nil
2022-07-28 09:18:01 +00:00
default :
2023-05-08 02:52:00 +00:00
if TypeMap [ typeFiled ] == TypeOa {
2023-04-24 08:17:01 +00:00
return & ApprovalOA { } , nil
} else {
2023-05-08 08:46:05 +00:00
return & Approval { } , nil
2023-04-24 08:17:01 +00:00
}
2022-07-28 09:18:01 +00:00
}
}