Browse Source

feat: 安全巡检增加审批关闭、审批退回接口

lanjianrong 4 years ago
parent
commit
6d9361d1cc

+ 0 - 17
conf/project.go

@@ -45,20 +45,3 @@ var RunningCrontabService = false
 
 
 // 分页-页数
 // 分页-页数
 var PageSize = 10
 var PageSize = 10
-
-// 审批常量
-type auditStatus struct {
-	uncheck  int
-	checking int
-	checked  int
-	checkNo  int
-}
-
-func NewAuditConsts() *auditStatus {
-	return &auditStatus{
-		uncheck:  0, // 待审批
-		checking: 1, // 审批中
-		checked:  2, // 审批完成
-		checkNo:  3, // 退回
-	}
-}

+ 78 - 3
dao/safe_audit_dao.go

@@ -12,6 +12,8 @@ import (
 	"time"
 	"time"
 
 
 	"github.com/go-xorm/xorm"
 	"github.com/go-xorm/xorm"
+	"go.mod/comm"
+	"go.mod/conf"
 	"go.mod/models"
 	"go.mod/models"
 	"go.mod/web/viewmodels"
 	"go.mod/web/viewmodels"
 )
 )
@@ -48,8 +50,15 @@ func (d *SafeAuditDao) GetNewOrder(safeId int, times int) int {
 	}
 	}
 }
 }
 
 
+// 根据当前times,获取审批人
+func (d *SafeAuditDao) GetAuditors(id int, times int) []viewmodels.Auditors {
+	auditors := make([]viewmodels.Auditors, 0)
+	d.engine.Sql("select pa.`name` from `cm_project_account` as pa, `cm_safe_audit` as ca where ca.`safe_id` = ? and ca.`times` = ? and ca.audit_id = pa.id order by `audit_order`", id, times).Find(&auditors)
+	return auditors
+}
+
 // 根据当前times,获取审批人(包括原报)
 // 根据当前times,获取审批人(包括原报)
-func (d *SafeAuditDao) GetAuditors(id int, times int, cur_uid int) []viewmodels.Auditors {
+func (d *SafeAuditDao) GetAuditorsWithOwner(id int, times int, cur_uid int) []viewmodels.Auditors {
 	auditors := make([]viewmodels.Auditors, 0)
 	auditors := make([]viewmodels.Auditors, 0)
 
 
 	// 原报
 	// 原报
@@ -71,8 +80,74 @@ func (d *SafeAuditDao) GetAuditHistory(id int, times int) map[int][]viewmodels.H
 	auditorHistory := make(map[int][]viewmodels.HistorySafeAudit, 0)
 	auditorHistory := make(map[int][]viewmodels.HistorySafeAudit, 0)
 	for i := 1; i <= times; i++ {
 	for i := 1; i <= times; i++ {
 		auditors := make([]viewmodels.HistorySafeAudit, 0)
 		auditors := make([]viewmodels.HistorySafeAudit, 0)
-		d.engine.Sql("select pa.`name`, pa.`position`, ca.`create_time` as createTime, ca.`end_time` as endTime, ca.`opinion`, ca.`status` from `cm_project_account` as pa, `cm_safe_audit` as ca where ca.`safe_id` = ? and ca.audit_id = pa.id and times = ? order by `audit_order`", id, times).Find(&auditors)
-		auditorHistory[i] = auditors
+		d.engine.Sql("select ca.`id`, pa.`name`, pa.`position`, ca.`create_time` as createTime, ca.`end_time` as endTime, ca.`opinion`, ca.`status` from `cm_project_account` as pa, `cm_safe_audit` as ca where ca.`safe_id` = ? and ca.audit_id = pa.id and times = ? order by `audit_order`", id, times).Find(&auditors)
+		auditorsArr := make([]viewmodels.HistorySafeAudit, 0)
+		for _, auditor := range auditors {
+			auditorVM := viewmodels.HistorySafeAudit{}
+			id, _ := comm.AesEncrypt(auditor.Id, conf.SignSecret)
+			auditorVM.Id = id
+			auditorVM.Createtime = auditor.Createtime
+			auditorVM.EndTime = auditor.EndTime
+			auditorVM.Name = auditor.Name
+			auditorVM.Position = auditor.Position
+			auditorVM.Status = auditor.Status
+			auditorVM.Opinion = auditor.Opinion
+			auditorsArr = append(auditorsArr, auditorVM)
+		}
+		auditorHistory[i] = auditorsArr
 	}
 	}
 	return auditorHistory
 	return auditorHistory
 }
 }
+
+// 根据id获取记录
+func (d *SafeAuditDao) FindById(id int) (*models.CmSafeAudit, error) {
+	data := &models.CmSafeAudit{Id: id}
+	_, err := d.engine.Get(data)
+	return data, err
+}
+
+// 改变审批记录状态
+func (d *SafeAuditDao) ChangeStatusById(id int, opinion string, status int) error {
+	data := &models.CmSafeAudit{EndTime: time.Now(), Opinion: opinion, Status: status}
+	_, err := d.engine.ID(id).Cols("end_time", "opinion", "status").Update(data)
+	return err
+}
+
+// 拷贝新的审批流程
+func (d *SafeAuditDao) CopyAuditors(safeId int, times int, auditType string, uid int) error {
+	oldAuditors := make([]models.CmSafeAudit, 0)
+	err := d.engine.Where("safe_id = ? and times = ?", safeId, times).Find(&oldAuditors)
+	if err != nil {
+		return err
+	}
+
+	var copyStatus = true
+	fmt.Println("auditType", auditType)
+	newAuditors := make([]models.CmSafeAudit, 0)
+	for _, auditor := range oldAuditors {
+		auditorVM := models.CmSafeAudit{}
+		auditorVM.SafeId = auditor.SafeId
+		auditorVM.BidsectionId = auditor.BidsectionId
+		auditorVM.Times = auditor.Times + 1
+		auditorVM.AuditId = auditor.AuditId
+		auditorVM.AuditOrder = auditor.AuditOrder
+		auditorVM.Progress = auditor.Progress
+		auditorVM.CreateTime = time.Now()
+		auditorVM.Status = auditor.Status
+		// 上报人
+		if auditType == "uncheck" {
+			auditorVM.Status = 0
+		} else {
+			if auditor.AuditId == uid {
+				auditorVM.Status = 0
+				copyStatus = false
+			}
+		}
+		if !copyStatus {
+			auditorVM.Status = 0
+		}
+		newAuditors = append(newAuditors, auditorVM)
+	}
+	_, err = d.engine.Insert(&newAuditors)
+	return err
+}

+ 7 - 0
dao/safe_dao.go

@@ -79,3 +79,10 @@ func (d *SafeDao) CountRuleCode(bid int) (int64, error) {
 	}
 	}
 	return total, err
 	return total, err
 }
 }
+
+// 更改status
+func (d *SafeDao) ChangeStatus(id int, status int, times int) error {
+	data := &models.CmSafe{Status: status, Times: times}
+	_, err := d.engine.ID(id).Update(data)
+	return err
+}

+ 76 - 1
services/safe_audit.service.go

@@ -7,6 +7,7 @@
 package services
 package services
 
 
 import (
 import (
+	"errors"
 	"log"
 	"log"
 
 
 	"github.com/kataras/iris/v12"
 	"github.com/kataras/iris/v12"
@@ -18,16 +19,26 @@ import (
 type SafeAuditService interface {
 type SafeAuditService interface {
 	ValidRule(ctx iris.Context) (viewmodels.SafeAudit, error)
 	ValidRule(ctx iris.Context) (viewmodels.SafeAudit, error)
 	AddAuditor(safeId int, bId int, auditId int, times int) error
 	AddAuditor(safeId int, bId int, auditId int, times int) error
+	CloseAudit(id int, opinion string, curUid int, saveId int) error
+	BackAudit(id int, opinion string, curUid int, saveId int, auditId int, progress string) error
 }
 }
 
 
 type safeAuditService struct {
 type safeAuditService struct {
+	validaAdd    string
+	validaClose  string
+	validaBack   string
 	daoSafeAudit *dao.SafeAuditDao
 	daoSafeAudit *dao.SafeAuditDao
+	daoSafe      *dao.SafeDao
 }
 }
 
 
 //创建项目用户service
 //创建项目用户service
 func NewSafeAuditService() SafeAuditService {
 func NewSafeAuditService() SafeAuditService {
 	return &safeAuditService{
 	return &safeAuditService{
+		validaBack:   "/api/safe_audit/back",
+		validaAdd:    "/api/safe_audit/add",
+		validaClose:  "/api/safe_audit/close",
 		daoSafeAudit: dao.NewSafeAuditDao(datasource.InstanceDbMaster()),
 		daoSafeAudit: dao.NewSafeAuditDao(datasource.InstanceDbMaster()),
+		daoSafe:      dao.NewSafeDao(datasource.InstanceDbMaster()),
 	}
 	}
 }
 }
 
 
@@ -37,6 +48,61 @@ func (s *safeAuditService) AddAuditor(safeId int, bId int, auditId int, times in
 	return err
 	return err
 }
 }
 
 
+// 关闭审批流程
+func (s *safeAuditService) CloseAudit(id int, opinion string, curUid int, saveId int) error {
+	auditor, err := s.daoSafeAudit.FindById(id)
+	if err != nil {
+		return err
+	}
+	if auditor.AuditId != curUid {
+		return errors.New("该用户没有审批权限!")
+	}
+	// 更改cm_safe_audit的记录
+	err = s.daoSafeAudit.ChangeStatusById(id, opinion, 3)
+	if err != nil {
+		return err
+	}
+	// 更改cm_safe的记录
+	err = s.daoSafe.ChangeStatus(saveId, 3, auditor.Times)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// 审批退回
+func (s *safeAuditService) BackAudit(id int, opinion string, curUid int, saveId int, auditId int, progress string) error {
+	auditor, err := s.daoSafeAudit.FindById(id)
+	if err != nil {
+		return err
+	}
+	if auditor.AuditId != curUid {
+		return errors.New("该用户没有审批权限!")
+	}
+	// 更改cm_safe_audit的记录
+	err = s.daoSafeAudit.ChangeStatusById(id, opinion, 2)
+	if err != nil {
+		return err
+	}
+
+	safeData := s.daoSafe.FindById(saveId)
+	// 拷贝审批流程
+	// 退回检查人-uncheck
+	// 整改人审批退回-checking
+	// 复查人审批退回-checkNo
+	// 审批组退回-checked
+	err = s.daoSafeAudit.CopyAuditors(saveId, safeData.Times, progress, auditId)
+	if err != nil {
+		return err
+	}
+	// 更改cm_safe的记录
+	err = s.daoSafe.ChangeStatus(saveId, 2, auditor.Times+1)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
 // 规则校验
 // 规则校验
 func (s *safeAuditService) ValidRule(ctx iris.Context) (viewmodels.SafeAudit, error) {
 func (s *safeAuditService) ValidRule(ctx iris.Context) (viewmodels.SafeAudit, error) {
 	safeAuditVaild := viewmodels.SafeAudit{}
 	safeAuditVaild := viewmodels.SafeAudit{}
@@ -46,7 +112,16 @@ func (s *safeAuditService) ValidRule(ctx iris.Context) (viewmodels.SafeAudit, er
 			log.Println("safe-ValidRule-ReadJson转换异常, error=", err)
 			log.Println("safe-ValidRule-ReadJson转换异常, error=", err)
 			return safeAuditVaild, err
 			return safeAuditVaild, err
 		}
 		}
-		err = safeAuditVaild.ValidateAddAuditor()
+		if ctx.Path() == s.validaAdd {
+			err = safeAuditVaild.ValidateAddAuditor()
+			return safeAuditVaild, err
+		} else if ctx.Path() == s.validaClose {
+			err = safeAuditVaild.ValidateClose()
+			return safeAuditVaild, err
+		} else if ctx.Path() == s.validaBack {
+			err = safeAuditVaild.ValidateBack()
+			return safeAuditVaild, err
+		}
 		return safeAuditVaild, err
 		return safeAuditVaild, err
 	}
 	}
 	return safeAuditVaild, nil
 	return safeAuditVaild, nil

+ 1 - 1
services/safe_service.go

@@ -123,7 +123,7 @@ func (s *safeService) GetDetail(id int, pid int) (viewmodels.SafeDetail, map[int
 	fileVM.FileList = fileArr
 	fileVM.FileList = fileArr
 	fileVM.Total = total
 	fileVM.Total = total
 	data.File = fileVM
 	data.File = fileVM
-	auditors := s.daoSafeAudit.GetAuditors(safeData.Id, safeData.Times, account.Id)
+	auditors := s.daoSafeAudit.GetAuditorsWithOwner(safeData.Id, safeData.Times, account.Id)
 	auditHistory := s.daoSafeAudit.GetAuditHistory(safeData.Id, safeData.Times)
 	auditHistory := s.daoSafeAudit.GetAuditHistory(safeData.Id, safeData.Times)
 	data.Auditors = auditors
 	data.Auditors = auditors
 
 

+ 105 - 0
web/api/safe_audit_api.go

@@ -68,3 +68,108 @@ func (c *SafeAuditApi) PostAdd() {
 		"msg":  "插入成功",
 		"msg":  "插入成功",
 	})
 	})
 }
 }
+
+// @Summary 关闭审批流程
+// @Tags 安全巡检-审批
+// @Description 直接停止审批流程
+// @Accept  json
+// @Produce  json
+// @Param   id     body    string     true        "审批id"
+// @Param   safe_id     body    string     true        "巡检id"
+// @Param   opinion     body    string     true        "审批意见"
+// @Success 200 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
+// @Failure 400 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
+// @Router /api/safe_audit/close [post]
+func (c *SafeAuditApi) PostClose() {
+	// 1.规则验证
+	safeAuditData, err := c.SafeAuditService.ValidRule(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	// 2.获取审批记录id
+	id, err := utils.GetDecryptId(safeAuditData.Id)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "ReadJSON转换异常,请检查参数"})
+		return
+	}
+	// 3.获取安全巡检记录id
+	safeId, err := utils.GetDecryptId(safeAuditData.SafeId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "ReadJSON转换异常,请检查参数"})
+		return
+	}
+	// 4.解析登录id
+	uid, err := utils.GetProjectAccountId(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	// 5. 执行sql
+	err = c.SafeAuditService.CloseAudit(id, safeAuditData.Opinion, uid, safeId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	// 6. 返回结果
+	c.Ctx.JSON(iris.Map{
+		"code": 0,
+		"msg":  "请求成功",
+	})
+}
+
+// @Summary 审批退回
+// @Tags 安全巡检-审批
+// @Description
+// @Accept  json
+// @Produce  json
+// @Param   id     body    string     true        "审批id"
+// @Param   safe_id     body    string     true        "巡检id"
+// @Param   audit_id     body    string     true        "回滚的审批人id"
+// @Param   progress     body    string     true        "退回的类型,0审批,1整改,2复查,不传则为原报"
+// @Param   opinion     body    string     true        "审批意见"
+// @Success 200 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
+// @Failure 400 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
+// @Router /api/safe_audit/back [post]
+func (c *SafeAuditApi) PostBack() {
+	// 1.规则验证
+	safeAuditData, err := c.SafeAuditService.ValidRule(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	// 2.获取审批记录id
+	id, err := utils.GetDecryptId(safeAuditData.Id)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "ReadJSON转换异常,请检查参数"})
+		return
+	}
+	// 3.获取安全巡检记录id、回滚的审批人id
+	safeId, err := utils.GetDecryptId(safeAuditData.SafeId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "ReadJSON转换异常,请检查参数"})
+		return
+	}
+	auditId, err := utils.GetDecryptId(safeAuditData.AuditId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "ReadJSON转换异常,请检查参数"})
+		return
+	}
+	// 4.解析登录id
+	uid, err := utils.GetProjectAccountId(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	// 5. 执行sql
+	err = c.SafeAuditService.BackAudit(id, safeAuditData.Opinion, uid, safeId, auditId, safeAuditData.Progress)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	// 6. 返回结果
+	c.Ctx.JSON(iris.Map{
+		"code": 0,
+		"msg":  "请求成功",
+	})
+}

+ 17 - 0
web/viewmodels/safe_audit.go

@@ -22,10 +22,12 @@ type SafeAudit struct {
 	Status       int       `form:"status" json:"status" `
 	Status       int       `form:"status" json:"status" `
 	CreateTime   time.Time `form:"create_time" json:"create_time" `
 	CreateTime   time.Time `form:"create_time" json:"create_time" `
 	EndTime      time.Time `form:"end_time" json:"end_time" `
 	EndTime      time.Time `form:"end_time" json:"end_time" `
+	Progress     string    `form:"progress" json:"progress" `
 	Opinion      string    `form:"opinion" json:"opinion" `
 	Opinion      string    `form:"opinion" json:"opinion" `
 }
 }
 
 
 type HistorySafeAudit struct {
 type HistorySafeAudit struct {
+	Id         string    `from:"Id" json:"Id"`
 	Name       string    `from:"name" json:"name"`
 	Name       string    `from:"name" json:"name"`
 	Position   string    `from:"position" json:"position"`
 	Position   string    `from:"position" json:"position"`
 	Createtime time.Time `from:"create_time" json:"create_time"`
 	Createtime time.Time `from:"create_time" json:"create_time"`
@@ -42,3 +44,18 @@ func (l SafeAudit) ValidateAddAuditor() error {
 		validation.Field(&l.AuditId, validation.Required.Error("审核人不能为空")),
 		validation.Field(&l.AuditId, validation.Required.Error("审核人不能为空")),
 	)
 	)
 }
 }
+
+func (l SafeAudit) ValidateClose() error {
+	return validation.ValidateStruct(&l,
+		validation.Field(&l.Id, validation.Required.Error("记录id不能为空")),
+		validation.Field(&l.SafeId, validation.Required.Error("巡检id不能为空")),
+	)
+}
+
+func (l SafeAudit) ValidateBack() error {
+	return validation.ValidateStruct(&l,
+		validation.Field(&l.Id, validation.Required.Error("记录id不能为空")),
+		validation.Field(&l.SafeId, validation.Required.Error("巡检id不能为空")),
+		validation.Field(&l.AuditId, validation.Required.Error("回滚用户不能为空")),
+	)
+}