123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348 |
- /*
- * @description: 审批流程数据库操作相关
- * @Author: LanJianRong
- * @Date: 2021-01-06
- * @FilePath: \construction_management\dao\approver_dao.go
- */
- package dao
- import (
- "errors"
- "fmt"
- "strconv"
- "time"
- "github.com/go-xorm/xorm"
- "go.mod/comm"
- "go.mod/conf"
- "go.mod/models"
- "go.mod/web/viewmodels"
- )
- // 数据库操作引擎
- type ApproverDao struct {
- engine *xorm.Engine
- }
- // 获得一个DAO对象
- func NewApproverDao(engine *xorm.Engine) *ApproverDao {
- return &ApproverDao{
- engine: engine,
- }
- }
- // 批量插入数据
- func (d *ApproverDao) InsertData(bid int, pid int, dataType int, dataId int, auditors []int, reAuditors []int) error {
- data := make([]models.CmApprover, 0)
- for i, item := range auditors {
- approverVM := models.CmApprover{}
- approverVM.AuditId = item
- approverVM.AuditOrder = i + 1
- approverVM.Progress = 0
- approverVM.BidsectionId = bid
- approverVM.ProjectId = pid
- approverVM.DataType = dataType
- approverVM.DataId = dataId
- approverVM.Status = 0
- if i == 0 {
- approverVM.Status = 1
- }
- data = append(data, approverVM)
- }
- checkVM := models.CmApprover{}
- checkVM.AuditOrder = len(auditors) + 1
- checkVM.Progress = 1
- checkVM.BidsectionId = bid
- checkVM.ProjectId = pid
- checkVM.DataType = dataType
- checkVM.DataId = dataId
- data = append(data, checkVM)
- for i, item := range reAuditors {
- approverVM := models.CmApprover{}
- approverVM.AuditId = item
- approverVM.AuditOrder = i + 2 + len(auditors)
- approverVM.Progress = 2
- approverVM.BidsectionId = bid
- approverVM.ProjectId = pid
- approverVM.DataType = dataType
- approverVM.DataId = dataId
- data = append(data, approverVM)
- }
- _, err := d.engine.Insert(data)
- return err
- }
- // 更改状态
- func (d *ApproverDao) ChangeStatus(id int, status int) error {
- data := &models.CmApprover{Status: status}
- _, err := d.engine.Where("id = ?", id).Cols("status").Update(data)
- return err
- }
- // 更改审批人
- func (d *ApproverDao) ChangeAuditId(bid int, dataType int, dataId int, auditOrder int, uid int) error {
- data := &models.CmApprover{AuditId: uid}
- _, err := d.engine.Where("bidsection_id = ? and data_type = ? and data_id = ? and audit_order = ?", bid, dataType, dataId, auditOrder).Cols("audit_id").Update(data)
- return err
- }
- // 更改下一个审批人的状态
- func (d *ApproverDao) ChangeNextStatus(id int, status int) error {
- data := &models.CmApprover{Id: id}
- _, err := d.engine.Get(data)
- newData := &models.CmApprover{Status: status}
- _, err = d.engine.Where("bidsection_id = ? and data_type = ? and data_id = ? and audit_order = ?", data.BidsectionId, data.DataType, data.DataId, data.AuditOrder+1).Cols("status").Update(newData)
- return err
- }
- // 根据当前times,获取审批流程(包括原报)
- func (d *ApproverDao) GetAuditorsWithOwner(bid int, dataType int, dataId int, cur_uid int) []viewmodels.Auditors {
- auditors := make([]viewmodels.Auditors, 0)
- auditor := viewmodels.Auditors{Progress: "", Id: "", Status: 2}
- _, err := d.engine.Sql("select name, company, position, mobile, id as `audit_id` from `cm_project_account` where id = ?", cur_uid).Get(&auditor)
- if err != nil {
- fmt.Println(err)
- }
- auditors = append(auditors, auditor)
- d.engine.Sql("select pa.`company`, pa.`name`, pa.`account_group`,pa.`mobile`, pa.`position`,ca.`audit_id` as `audit_id`, ca.`id`, ca.`status`, ca.`audit_order`, ca.`progress` from `cm_project_account` as pa, `cm_approver` as ca where ca.`bidsection_id` = ? and ca.`data_type` = ? and ca.`data_id` = ? and ca.audit_id = pa.id order by `audit_order`", bid, dataType, dataId).Find(&auditors)
- // 原报
- return auditors
- }
- func (d *ApproverDao) FindApproverById(id int) (*models.CmApprover, error) {
- data := &models.CmApprover{}
- _, err := d.engine.ID(id).Get(data)
- return data, err
- }
- // 获取最新的审核人
- func (d *ApproverDao) GetLastedAuditor(bid int, dataType int, dataId int) *viewmodels.Approver {
- data := &models.CmApprover{BidsectionId: bid, DataType: dataType, DataId: dataId, Status: 1}
- has, _ := d.engine.Get(data)
- approverVM := &viewmodels.Approver{}
- if has == true {
- id, _ := comm.AesEncrypt(strconv.Itoa(data.Id), conf.SignSecret)
- approverVM.Id = id
- pid, _ := comm.AesEncrypt(strconv.Itoa(data.ProjectId), conf.SignSecret)
- approverVM.ProjectId = pid
- bid, _ := comm.AesEncrypt(strconv.Itoa(data.BidsectionId), conf.SignSecret)
- approverVM.BidsectionId = bid
- dataId, _ := comm.AesEncrypt(strconv.Itoa(data.DataId), conf.SignSecret)
- approverVM.DataId = dataId
- auditId, _ := comm.AesEncrypt(strconv.Itoa(data.AuditId), conf.SignSecret)
- approverVM.AuditId = auditId
- approverVM.AuditOrder = data.AuditOrder
- approverVM.DataType = data.DataType
- approverVM.Progress = strconv.Itoa(data.Progress)
- approverVM.Status = data.Status
- }
- return approverVM
- }
- // 获取最后一个审批人
- func (d *ApproverDao) GetLastAuditor(bid int, dataType int, dataId int) (*models.CmApprover, error) {
- data := &models.CmApprover{BidsectionId: bid, DataType: dataType, DataId: dataId}
- _, err := d.engine.Desc("audit_order").Limit(1).Get(data)
- return data, err
- }
- // 初始化审批流程状态
- func (d *ApproverDao) InitStatus(bid int, dataType int, dataId int, auditId int, times int, progress int, opinion string) error {
- session := d.engine.NewSession()
- defer session.Close()
- err := session.Begin()
- if err != nil {
- return errors.New("操作失败-db")
- }
- data := &models.CmApprover{Status: 0}
- _, err = session.Where("bidsection_id = ? and data_type = ? and data_id = ?", bid, dataType, dataId).Cols("status").Update(data)
- if err != nil {
- session.Rollback()
- return err
- }
- _, err = session.Exec("update cm_safe set status = ?, times = ? where id = ?", 0, times+1, dataId)
- if err != nil {
- session.Rollback()
- return err
- }
- // 增加审批日志
- safeAudit := &models.CmSafeAudit{BidsectionId: bid, SafeId: dataId, Times: times, AuditId: auditId, Status: 1, Progress: 0, CreateTime: time.Now(), Opinion: opinion}
- _, err = session.Insert(safeAudit)
- if err != nil {
- session.Rollback()
- return err
- }
- err = session.Commit()
- if err != nil {
- return err
- }
- return nil
- }
- // 审批通过
- func (d *ApproverDao) PassHandler(id int, uid int, auditId int, opinion string, rectifiedInfo string) error {
- session := d.engine.NewSession()
- defer session.Close()
- // add Begin() before any action
- err := session.Begin()
- auditor, err := d.FindApproverById(id)
- if err != nil {
- return err
- }
- if auditor.AuditId != uid {
- return errors.New("该用户没有审批权限!")
- }
- safe := &models.CmSafe{}
- _, err = session.ID(auditor.DataId).Get(safe)
- if err != nil {
- session.Rollback()
- return err
- }
- // 增加审批日志
- auditReacord := &models.CmSafeAudit{BidsectionId: auditor.BidsectionId, SafeId: auditor.DataId, AuditId: auditor.AuditId, Times: safe.Times, CreateTime: time.Now(), Status: 0, Progress: auditor.Progress + 1, Opinion: opinion, Rectifiedinfo: rectifiedInfo}
- _, err = session.Insert(auditReacord)
- if err != nil {
- session.Rollback()
- return err
- }
- // 改变审批流程中当前审批人以及下一个审批人的审批流程状态
- curData := &models.CmApprover{Status: 2}
- _, err = session.ID(id).Cols("status").Update(curData)
- if err != nil {
- session.Rollback()
- return err
- }
- nextData := &models.CmApprover{Status: 1}
- _, err = session.Where("bidsection_id = ? and data_type = ? and data_id = ? and audit_order = ?", auditor.BidsectionId, auditor.DataType, auditor.DataId, auditor.AuditOrder+1).Cols("status").Update(nextData)
- if err != nil {
- session.Rollback()
- return err
- }
- if auditId != 0 {
- // 审批人选择了整改人
- // 修改cm_safe表的status状态为待整改
- _, err = session.Exec("update `cm_safe` set status = ? where id = ?", 2, auditor.DataId)
- if err != nil {
- session.Rollback()
- return err
- }
- // 改变审批流程中的整改人id
- _, err = session.Exec("update `cm_approver` set `audit_id` = ? where `bidsection_id` = ? and `data_type` = ? and `data_id` = ? and `audit_order` = ?", auditId, auditor.BidsectionId, auditor.DataType, auditor.DataId, auditor.AuditOrder+1)
- if err != nil {
- session.Rollback()
- return err
- }
- } else {
- if auditor.Progress == 1 {
- // 整改人审批流程
- // 修改cm_safe表的status状态为待复查
- _, err = session.Exec("update `cm_safe` set status = ? where id = ?", 3, auditor.DataId)
- if err != nil {
- session.Rollback()
- return err
- }
- } else {
- // 复查流程
- // 查找最后一个审批人
- lastAuditor := &models.CmApprover{BidsectionId: auditor.BidsectionId, DataType: auditor.DataType, DataId: auditor.DataId}
- _, err = session.Desc("audit_order").Limit(1).Get(lastAuditor)
- if err != nil {
- session.Rollback()
- return err
- }
- if lastAuditor.AuditId == auditor.AuditId {
- // 说明审批流程已经走完
- _, err = session.Exec("update `cm_safe` set status = ? where id = ?", 4, auditor.DataId)
- if err != nil {
- session.Rollback()
- return err
- }
- }
- }
- }
- err = session.Commit()
- return err
- }
- // 审批流程-退回
- func (d *ApproverDao) BackHandlerWithId(id int, uid int, times int, progress int, opinion string) error {
- session := d.engine.NewSession()
- defer session.Close()
- // add Begin() before any action
- err := session.Begin()
- // auditor, err := d.FindApproverById(id)
- auditor := &models.CmApprover{}
- _, err = session.ID(id).Get(auditor)
- data := &models.CmApprover{Status: 0}
- // 将往后的所有记录的status改为0
- _, err = session.Where("bidsection_id = ? and data_type = ? and data_id = ? and audit_order > ?", auditor.BidsectionId, auditor.DataType, auditor.DataId, auditor.AuditOrder).Cols("status").Update(data)
- if err != nil {
- session.Rollback()
- return err
- }
- // 将当前的记录改为1-待审批
- data.Status = 1
- _, err = session.ID(id).Cols("status").Update(data)
- if err != nil {
- session.Rollback()
- return err
- }
- // 增加审批日志
- safeAudit := &models.CmSafeAudit{BidsectionId: auditor.BidsectionId, SafeId: auditor.DataId, Times: times, AuditId: uid, Status: 1, Progress: progress, CreateTime: time.Now(), Opinion: opinion}
- _, err = session.Insert(safeAudit)
- if err != nil {
- session.Rollback()
- return err
- }
- err = session.Commit()
- return err
- }
- func (d *ApproverDao) CloseHandler(id int, opinion string, curUid int, saveId int) error {
- session := d.engine.NewSession()
- defer session.Close()
- // add Begin() before any action
- err := session.Begin()
- auditor, err := d.FindApproverById(id)
- if auditor.AuditId != curUid {
- return errors.New("该用户没有审批权限!")
- }
- safe := &models.CmSafe{}
- _, err = session.ID(saveId).Get(safe)
- if err != nil {
- session.Rollback()
- return err
- }
- // 增加审批日志
- safeAudit := &models.CmSafeAudit{BidsectionId: auditor.BidsectionId, SafeId: auditor.DataId, Times: safe.Times, AuditId: auditor.AuditId, Status: 2, Progress: auditor.Progress, CreateTime: time.Now(), Opinion: opinion}
- _, err = session.Insert(safeAudit)
- if err != nil {
- session.Rollback()
- return err
- }
- // 更改cm_safe的记录
- _, err = session.Exec("update `cm_safe` set status = ? where id = ? ", 5, saveId)
- if err != nil {
- session.Rollback()
- return err
- }
- // 更改cm_approver的记录
- _, err = session.Exec("update `cm_approver` set status = ? where id = ? ", 3, id)
- if err != nil {
- session.Rollback()
- return err
- }
- return err
- }
- // 删除旧的审批流程
- func (d *ApproverDao) DeleteOldAuditors(bid int, dataType int, dataId int) error {
- data := &models.CmApprover{BidsectionId: bid, DataType: dataType, DataId: dataId}
- _, err := d.engine.Delete(data)
- return err
- }
|