package models import ( "errors" "fmt" "lapp_-wy/db" "lapp_-wy/utils" "time" ) type WfApprovalrequestSteplst struct { Approvalrequestid int `json:"approvalrequestid" xorm:"not null pk INT(11)"` Approvallevel int `json:"approvallevel" xorm:"not null pk INT(8)"` Cid int `json:"cid" xorm:"default NULL INT(11)"` Approvalmodelid int `json:"approvalmodelid" xorm:"INT(11)"` Descr string `json:"descr" xorm:"default 'NULL' VARCHAR(255)"` Remark string `json:"remark" xorm:"default 'NULL' VARCHAR(255)"` Status string `json:"status" xorm:"default 'NULL' VARCHAR(2)"` Approvestatus int `json:"approvestatus" xorm:"default NULL INT(2)"` Approvetime string `json:"approvetime" xorm:"default 'NULL' VARCHAR(20)"` Approver string `json:"approver" xorm:"not null pk VARCHAR(20)"` Lastmodif string `json:"lastmodif" xorm:"default 'NULL' VARCHAR(14)"` Lastuser string `json:"lastuser" xorm:"default 'NULL' VARCHAR(20)"` Credatuz string `json:"credatuz" xorm:"default 'NULL' VARCHAR(14)"` } func (t *WfApprovalrequestSteplst) TableName() string { return "wf_approvalrequest_steplst" } //审核(逻辑:完成一步,添加一步!)approvestatus:1是通过,2是拒绝 func (t *WfApprovalrequestSteplst) AuditInfo() error { engine := db.MasterEngine() session := engine.NewSession() defer session.Close() // add Begin() before any action err := session.Begin() if err != nil { session.Rollback() return err } upinfo := new(WfApprovalrequestSteplst) upinfo.Approvestatus = t.Approvestatus upinfo.Approver = t.Approver upinfo.Remark = t.Remark upinfo.Approvetime = utils.TimeFormat(time.Now(), "yyyy-MM-dd HH:mm:ss") upinfo.Lastmodif = t.Lastmodif upinfo.Credatuz = t.Credatuz upinfo.Lastuser = t.Lastuser //第一步:判断审核是通过还是拒绝 if t.Approvestatus == 1 { //通过 //1.先修改 _, err = session.Table("wf_approvalrequest_steplst").Cols("remark", "approver", "approvestatus", "approvetime", "lastuser", "lastmodif").Where("approvalrequestid = ? and approvallevel = ?", t.Approvalrequestid, t.Approvallevel).Update(upinfo) if err != nil { session.Rollback() return err } //2.生成待审核逻辑 level := t.Approvallevel + 1 //如果是最后一个级别,结束并且更新报销任务 data := new(WfApprovalmodelSteplst) ok, err := engine.Table("wf_approvalmodel_steplst").Where("approvalmodelid = ? and approvallevel = ?", t.Approvalmodelid, level).Get(data) if err != nil { session.Rollback() return err } if ok { //还需要审核 info := new(WfApprovalrequestSteplst) info.Approvalrequestid = t.Approvalrequestid info.Approvallevel = level info.Status = "1" info.Descr = data.Descr info.Approvestatus = 0 info.Lastmodif = t.Lastmodif info.Lastuser = t.Lastuser info.Approvalmodelid = data.Approvalmodelid _, err := session.Table("wf_approvalrequest_steplst").Insert(info) if err != nil { session.Rollback() return err } req := new(WfApprovalrequest) req.Status = "2" //2.更改报销需求 _, err = session.Table("wf_approvalrequest").Cols("status").Where("approvalrequestid = ?", t.Approvalrequestid).Update(req) if err != nil { session.Rollback() return err } } else { //不需要审核 //1.先修改 _, err = session.Table("wf_approvalrequest_steplst").Cols("remark", "approver", "approvestatus", "approvetime", "lastuser", "lastmodif").Where("approvalrequestid = ? and approvallevel = ?", t.Approvalrequestid, t.Approvallevel).Update(upinfo) if err != nil { session.Rollback() return err } req := new(WfApprovalrequest) req.Status = "3" req.Approvestatus = 1 //2.更改报销需求 _, err = session.Table("wf_approvalrequest").Cols("status", "approvestatus").Where("approvalrequestid = ?", t.Approvalrequestid).Update(req) if err != nil { session.Rollback() return err } } } else if t.Approvestatus == 2 { //拒绝 //1.先修改 _, err = session.Table("wf_approvalrequest_steplst").Cols("remark", "approver", "approvestatus", "approvetime", "lastuser", "lastmodif").Where("approvalrequestid = ? and approvallevel = ?", t.Approvalrequestid, t.Approvallevel).Update(upinfo) if err != nil { session.Rollback() return err } req := new(WfApprovalrequest) req.Status = "3" req.Approvestatus = 2 //2.更改报销需求 _, err = session.Table("wf_approvalrequest").Cols("status", "approvestatus").Where("approvalrequestid = ?", t.Approvalrequestid).Update(req) if err != nil { session.Rollback() return err } } else { return errors.New("修改状态错误!") } err = session.Commit() if err != nil { return err } return nil } type WfApprovalrequestData struct { Approvalrequestid int `json:"approvalrequestid"` Approvalmodelid int `json:"approvalmodelid"` Requester string `json:"requester"` Agentman string `json:"agentman"` Subject string `json:"subject"` Requesttime string `json:"requesttime"` Status string `json:"status"` Approvestatus int `json:"approvestatus"` Itemname string `json:"itemname"` Specmodel string `json:"specmodel"` Qty int `json:"qty"` Cid int `json:"cid"` Price float64 `json:"price"` Money float64 `json:"money"` Requestinfo string `json:"requestinfo"` Approvaltype string `json:"approvaltype"` Requestobjid string `json:"requestobjid"` Callbackfunc string `json:"callbackfunc"` Approvallevel int `json:"approvallevel"` Descr string `json:"descr"` Picpath string `json:"picpath"` Remark string `json:"remark"` Approvetime string `json:"approvetime"` Approver string `json:"approver"` Reqtype int `json:"reqtype"` Purpose string `json:"purpose"` Detail []WfApprovalrequestDetail `json:"detail"` } //查询所有的审核记录 func (t *WfApprovalrequestSteplst) GetPage(pageSize int, pageIndex int, approvetime string, role string, approvaltype string) ([]WfApprovalrequestData, int, error) { data := make([]WfApprovalrequestData, 0) e := db.MasterEngine() query := e.Table("wf_approvalrequest_steplst").Alias("a").Select("wf_approvalrequest.agentman,wf_approvalrequest.subject,wf_approvalrequest.status,wf_approvalrequest.cid,a.approvestatus,a.approvallevel,a.descr,a.remark,a.approvetime,wf_approvalrequest.approvalrequestid,wf_approvalrequest.approvalmodelid,wf_approvalrequest.picpath,wf_approvalrequest.requester,wf_approvalrequest.requesttime,wf_approvalrequest.itemname,wf_approvalrequest.specmodel,wf_approvalrequest.qty,wf_approvalrequest.price,wf_approvalrequest.money,wf_approvalrequest.requestinfo,wf_approvalrequest.approvaltype,wf_approvalrequest.requestobjid,wf_approvalrequest.callbackfunc,a.approver,wf_approvalrequest.reqtype,wf_approvalrequest.purpose").Join("INNER", "wf_approvalrequest", "a.approvalrequestid = wf_approvalrequest.approvalrequestid").Where("1=1") table := e.Table("wf_approvalrequest_steplst").Alias("a").Join("INNER", "wf_approvalrequest", "a.approvalrequestid = wf_approvalrequest.approvalrequestid").Where("1=1") if t.Approvestatus > 0 { query = query.And("a.approvestatus = ?", t.Approvestatus) table = table.And("a.approvestatus = ?", t.Approvestatus) } if !utils.ValueIsEmpty(t.Status) { query = query.And("wf_approvalrequest.status = ?", t.Status) table = table.And("wf_approvalrequest.status = ?", t.Status) } if !utils.ValueIsEmpty(approvaltype) { query = query.And("wf_approvalrequest.approvaltype = ?", approvaltype) table = table.And("wf_approvalrequest.approvaltype = ?", approvaltype) } if t.Cid > 0 && role != "topm" && role != "finance" { query = query.And("wf_approvalrequest.cid = ?", t.Cid) table = table.And("wf_approvalrequest.cid = ?", t.Cid) } if !utils.ValueIsEmpty(approvetime) { stime := approvetime + " 00:00:00" etime := approvetime + " 23:59:59" query = query.And("a.approvetime >= ?", stime) query = query.And("a.approvetime <= ?", etime) table = table.And("a.approvetime >= ?", stime) table = table.And("a.approvetime <= ?", etime) } if !utils.ValueIsEmpty(t.Descr) { descr := "%" + t.Descr + "%" query = query.And("a.descr like ?", descr) table = table.And("a.descr like ?", descr) } Offset := (pageIndex - 1) * pageSize err := query.Limit(pageSize, Offset).Desc("a.approvalrequestid").Find(&data) for k, v := range data { //查询对应的子项 sdata := make([]WfApprovalrequestDetail, 0) err = e.Table("wf_approvalrequest_detail").Where("approvalrequestid = ?", v.Approvalrequestid).Find(&sdata) if err != nil { continue } if len(sdata) > 0 { data[k].Detail = sdata } } pcount := new(WfApprovalrequestData) count, err := table.Count(pcount) if err != nil { return data, 0, err } return data, int(count), nil } //查询所有的审核任务 func (t *WfApprovalrequestSteplst) ListPage(pageSize int, pageIndex int, requesttime string, role string, reqType int) ([]WfApprovalrequestData, int, error) { data := make([]WfApprovalrequestData, 0) e := db.MasterEngine() query := e.Table("wf_approvalrequest_steplst").Alias("a").Select("wf_approvalrequest.agentman,wf_approvalrequest.subject,wf_approvalrequest.status,wf_approvalrequest.cid,a.approvestatus,a.approvallevel,a.descr,a.remark,a.approvetime,wf_approvalrequest.approvalrequestid,wf_approvalrequest.picpath,wf_approvalrequest.approvalmodelid,wf_approvalrequest.requester,wf_approvalrequest.requesttime,wf_approvalrequest.itemname,wf_approvalrequest.specmodel,wf_approvalrequest.qty,wf_approvalrequest.price,wf_approvalrequest.money,wf_approvalrequest.requestinfo,wf_approvalrequest.approvaltype,wf_approvalrequest.requestobjid,wf_approvalrequest.callbackfunc,a.approver,wf_approvalrequest.reqtype,wf_approvalrequest.purpose").Join("INNER", "wf_approvalrequest", "a.approvalrequestid = wf_approvalrequest.approvalrequestid").Where("a.approvestatus = ?", 0) table := e.Table("wf_approvalrequest_steplst").Alias("a").Join("INNER", "wf_approvalrequest", "a.approvalrequestid = wf_approvalrequest.approvalrequestid").Where("a.approvestatus = ?", 0) if reqType == 1 { query = query.And("wf_approvalrequest.reqtype = 1") table = table.And("wf_approvalrequest.reqtype = 1") } else { query = query.And(`wf_approvalrequest.reqtype != 1 or wf_approvalrequest.reqtype is null`) table = table.And(`wf_approvalrequest.reqtype != 1 or wf_approvalrequest.reqtype is null`) } if t.Lastuser != "admin" { query = query.And("'" + t.Lastuser + "'" + " in (SELECT approver FROM `wf_approver` WHERE (wf_approver.approvalmodelid = a.approvalmodelid and wf_approver.approvallevel = a.approvallevel))") table = table.And("'" + t.Lastuser + "'" + " in (SELECT approver FROM `wf_approver` WHERE (wf_approver.approvalmodelid = a.approvalmodelid and wf_approver.approvallevel = a.approvallevel))") } fmt.Println("test:", role) if t.Cid > 0 && role != "topm" && role != "finance" && role != "CFO" && role != "buyer" && role != "accounting" && role != "FM" { query = query.And("wf_approvalrequest.cid = ?", t.Cid) table = table.And("wf_approvalrequest.cid = ?", t.Cid) } if !utils.ValueIsEmpty(t.Descr) { descr := "%" + t.Descr + "%" query = query.And("a.descr like ?", descr) table = table.And("a.descr like ?", descr) } if !utils.ValueIsEmpty(requesttime) { stime := requesttime + " 00:00:00" etime := requesttime + " 23:59:59" query = query.And("wf_approvalrequest.requesttime >= ?", stime) query = query.And("wf_approvalrequest.requesttime <= ?", etime) table = table.And("wf_approvalrequest.requesttime >= ?", stime) table = table.And("wf_approvalrequest.requesttime <= ?", etime) } Offset := (pageIndex - 1) * pageSize err := query.Limit(pageSize, Offset).Desc("a.approvalrequestid").Find(&data) for k, v := range data { //查询对应的子项 sdata := make([]WfApprovalrequestDetail, 0) err = e.Table("wf_approvalrequest_detail").Where("approvalrequestid = ?", v.Approvalrequestid).Find(&sdata) if err != nil { continue } if len(sdata) > 0 { data[k].Detail = sdata } } pcount := new(WfApprovalrequestData) count, err := table.Count(pcount) if err != nil { return data, 0, err } return data, int(count), nil } type WfApprovalDataInfo struct { Approvallevel int `json:"approvallevel"` Approvestatus int `json:"approvestatus"` Descr string `json:"descr"` Remark string `json:"remark"` Approvetime string `json:"approvetime"` Approver string `json:"approver"` } //审批树状图 func (t *WfApprovalrequestSteplst) TreeInfo() ([]WfApprovalDataInfo, error) { data := make([]WfApprovalDataInfo, 0) e := db.MasterEngine() err := e.Table("wf_approvalmodel_steplst").Alias("a").Select("wf_approvalrequest_steplst.approvestatus,a.approvallevel,a.descr,wf_approvalrequest_steplst.remark,wf_approvalrequest_steplst.approvetime,wf_approvalrequest_steplst.approver").Join("LEFT", "wf_approvalrequest_steplst", "a.approvalmodelid = wf_approvalrequest_steplst.approvalmodelid and a.approvallevel = wf_approvalrequest_steplst.approvallevel").Where("a.approvalmodelid = ? and wf_approvalrequest_steplst.approvalrequestid = ?", t.Approvalmodelid, t.Approvalrequestid).Asc("a.approvallevel").Find(&data) if err != nil { return nil, err } return data, nil }