فهرست منبع

feat: 新增安全巡检开始审批接口

lanjianrong 4 سال پیش
والد
کامیت
b4076b52ee
7فایلهای تغییر یافته به همراه229 افزوده شده و 46 حذف شده
  1. 28 6
      dao/safe_audit_dao.go
  2. 56 6
      services/safe_audit.service.go
  3. 20 4
      services/safe_service.go
  4. 4 5
      web/api/safe_api.go
  5. 58 1
      web/api/safe_audit_api.go
  6. 17 11
      web/viewmodels/safe.go
  7. 46 13
      web/viewmodels/safe_audit.go

+ 28 - 6
dao/safe_audit_dao.go

@@ -62,15 +62,15 @@ func (d *SafeAuditDao) GetAuditorsWithOwner(id int, times int, cur_uid int) []vi
 	auditors := make([]viewmodels.Auditors, 0)
 
 	// 原报
-	auditor := viewmodels.Auditors{}
+	auditor := viewmodels.Auditors{Progress: ""}
 
-	_, err := d.engine.Sql("select `name` from `cm_project_account` where id = ?", cur_uid).Get(&auditor)
+	_, err := d.engine.Sql("select name, position, 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.`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)
+	d.engine.Sql("select pa.`name`, pa.`position`,ca.`audit_id`, ca.`progress` 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
 }
@@ -107,8 +107,8 @@ func (d *SafeAuditDao) FindById(id int) (*models.CmSafeAudit, error) {
 }
 
 // 改变审批记录状态
-func (d *SafeAuditDao) ChangeStatusById(id int, opinion string, status int) error {
-	data := &models.CmSafeAudit{EndTime: time.Now(), Opinion: opinion, Status: status}
+func (d *SafeAuditDao) ChangeStatusById(id int, opinion string, status int, rectifiedInfo string) error {
+	data := &models.CmSafeAudit{EndTime: time.Now(), Opinion: opinion, Status: status, Rectifiedinfo: rectifiedInfo}
 	_, err := d.engine.ID(id).Cols("end_time", "opinion", "status").Update(data)
 	return err
 }
@@ -159,10 +159,32 @@ func (d *SafeAuditDao) AddCheckWorker(id int, auditId int, opinion string) error
 		return err
 	}
 
-	data := &models.CmSafeAudit{BidsectionId: auditor.BidsectionId, AuditOrder: auditor.AuditOrder + 1, Times: auditor.Times, AuditId: auditId, Status: 0, Progress: 1, CreateTime: time.Now(), Opinion: opinion}
+	data := &models.CmSafeAudit{SafeId: auditor.SafeId, BidsectionId: auditor.BidsectionId, AuditOrder: auditor.AuditOrder + 1, Times: auditor.Times, AuditId: auditId, Status: 0, Progress: 1, CreateTime: time.Now(), Opinion: opinion}
 	_, err = d.engine.Insert(data)
 	if err != nil {
 		return err
 	}
 	return nil
 }
+
+// 查找最新的整改单
+func (d *SafeAuditDao) GetLastedOrder(safeId int) ([]viewmodels.CheckOrderVM, error) {
+	data := make([]viewmodels.CheckOrderVM, 0)
+	err := d.engine.Sql("select cm.`opinion`, cm.`status`, cm.`end_time`, pa.`name` from `cm_safe_audit` as cm left join `cm_project_account` as pa on pa.`id` = cm.`audit_id` where cm.`safe_id` = ? and cm.`progress` = ?", safeId, 1).Find(&data)
+	return data, err
+}
+
+// 获取当前的审核人
+func (d *SafeAuditDao) GetLastedAuditor(times int, safeId int) (*viewmodels.LatestAuditorVM, error) {
+	data := &viewmodels.LatestAuditorVM{}
+	_, err := d.engine.Sql("select audit_id, progress, status from cm_safe_audit where times = ? and safe_id = ? and status = 0 order by `audit_order` limit 1", times, safeId).Get(data)
+	auditId, _ := comm.AesEncrypt(data.AuditId, conf.SignSecret)
+	data.AuditId = auditId
+	return data, err
+}
+
+//
+func (d *SafeAuditDao) InsertData(data []models.CmSafeAudit) error {
+	_, err := d.engine.Insert(&data)
+	return err
+}

+ 56 - 6
services/safe_audit.service.go

@@ -9,19 +9,23 @@ package services
 import (
 	"errors"
 	"log"
+	"time"
 
 	"github.com/kataras/iris/v12"
 	"go.mod/dao"
 	"go.mod/datasource"
+	"go.mod/models"
 	"go.mod/web/viewmodels"
 )
 
 type SafeAuditService interface {
 	ValidRule(ctx iris.Context) (viewmodels.SafeAudit, error)
+	ValidStart(ctx iris.Context) (viewmodels.AuditStart, 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
-	PassAudit(id int, uid int, auditId int, opinion string) error
+	PassAudit(id int, uid int, auditId int, opinion string, rectifiedInfo string) error
+	StartAudit(safeId int, bidsectionId int, times int, auditors []int, reAuditors []int, uid int) error
 }
 
 type safeAuditService struct {
@@ -61,7 +65,7 @@ func (s *safeAuditService) CloseAudit(id int, opinion string, curUid int, saveId
 		return errors.New("该用户没有审批权限!")
 	}
 	// 更改cm_safe_audit的记录
-	err = s.daoSafeAudit.ChangeStatusById(id, opinion, 3)
+	err = s.daoSafeAudit.ChangeStatusById(id, opinion, 3, "")
 	if err != nil {
 		return err
 	}
@@ -83,7 +87,7 @@ func (s *safeAuditService) BackAudit(id int, opinion string, curUid int, saveId
 		return errors.New("该用户没有审批权限!")
 	}
 	// 更改cm_safe_audit的记录
-	err = s.daoSafeAudit.ChangeStatusById(id, opinion, 2)
+	err = s.daoSafeAudit.ChangeStatusById(id, opinion, 2, "")
 	if err != nil {
 		return err
 	}
@@ -107,7 +111,7 @@ func (s *safeAuditService) BackAudit(id int, opinion string, curUid int, saveId
 }
 
 // 审批通过
-func (s *safeAuditService) PassAudit(id int, uid int, auditId int, opinion string) error {
+func (s *safeAuditService) PassAudit(id int, uid int, auditId int, opinion string, rectifiedInfo string) error {
 	auditor, err := s.daoSafeAudit.FindById(id)
 	if err != nil {
 		return err
@@ -117,7 +121,7 @@ func (s *safeAuditService) PassAudit(id int, uid int, auditId int, opinion strin
 	}
 	if auditId != 0 {
 		// 审批人选择了整改人
-		err := s.daoSafeAudit.ChangeStatusById(auditor.Id, "", 1)
+		err := s.daoSafeAudit.ChangeStatusById(auditor.Id, "", 1, rectifiedInfo)
 		if err != nil {
 			return err
 		}
@@ -126,7 +130,7 @@ func (s *safeAuditService) PassAudit(id int, uid int, auditId int, opinion strin
 			return err
 		}
 	} else {
-		err := s.daoSafeAudit.ChangeStatusById(auditor.Id, "", 1)
+		err := s.daoSafeAudit.ChangeStatusById(auditor.Id, "", 1, rectifiedInfo)
 		if err != nil {
 			return err
 		}
@@ -134,6 +138,40 @@ func (s *safeAuditService) PassAudit(id int, uid int, auditId int, opinion strin
 	return nil
 }
 
+func (s *safeAuditService) StartAudit(safeId int, bidsectionId int, times int, auditors []int, reAuditors []int, uid int) error {
+	safe := s.daoSafe.FindById(safeId)
+	if safe.Uid != uid {
+		return errors.New("该用户没有操作权限!")
+	}
+	data := make([]models.CmSafeAudit, 0)
+	for i, item := range auditors {
+		auditVM := models.CmSafeAudit{}
+		auditVM.AuditId = item
+		auditVM.BidsectionId = bidsectionId
+		auditVM.SafeId = safeId
+		auditVM.AuditOrder = i + 1
+		auditVM.CreateTime = time.Now()
+		auditVM.Progress = 0
+		auditVM.Status = 0
+		auditVM.Times = times
+		data = append(data, auditVM)
+	}
+	for i, item := range reAuditors {
+		auditVM := models.CmSafeAudit{}
+		auditVM.AuditId = item
+		auditVM.BidsectionId = bidsectionId
+		auditVM.SafeId = safeId
+		auditVM.AuditOrder = i + 2 + len(auditors)
+		auditVM.CreateTime = time.Now()
+		auditVM.Progress = 2
+		auditVM.Status = 0
+		auditVM.Times = times
+		data = append(data, auditVM)
+	}
+	err := s.daoSafeAudit.InsertData(data)
+	return err
+}
+
 // 规则校验
 func (s *safeAuditService) ValidRule(ctx iris.Context) (viewmodels.SafeAudit, error) {
 	safeAuditVaild := viewmodels.SafeAudit{}
@@ -160,3 +198,15 @@ func (s *safeAuditService) ValidRule(ctx iris.Context) (viewmodels.SafeAudit, er
 	}
 	return safeAuditVaild, nil
 }
+
+// 校验审批开始
+func (s *safeAuditService) ValidStart(ctx iris.Context) (viewmodels.AuditStart, error) {
+	startAuditValid := viewmodels.AuditStart{}
+	err := ctx.ReadJSON(&startAuditValid)
+	if err != nil {
+		log.Println("safe-ValidRule-ReadJson转换异常, error=", err)
+		return startAuditValid, err
+	}
+	err = startAuditValid.ValidateStart()
+	return startAuditValid, err
+}

+ 20 - 4
services/safe_service.go

@@ -18,7 +18,7 @@ type SafeService interface {
 	Get(id int, pid int, pageNo int, pageSize int) ([]viewmodels.SafeList, int64)
 	Post(data models.CmSafe) error
 	Del(id int) error
-	GetDetail(id int, pid int) (viewmodels.SafeDetail, map[int][]viewmodels.HistorySafeAudit)
+	GetDetail(id int, pid int) viewmodels.SafeDetail
 	ValidRule(ctx iris.Context) (viewmodels.Safe, error)
 }
 
@@ -88,7 +88,7 @@ func (s *safeService) Del(id int) error {
 }
 
 // 详情页数据拼装
-func (s *safeService) GetDetail(id int, pid int) (viewmodels.SafeDetail, map[int][]viewmodels.HistorySafeAudit) {
+func (s *safeService) GetDetail(id int, pid int) viewmodels.SafeDetail {
 
 	safeData := s.daoSafe.FindById(id)
 	// fmt.Println(safeData)
@@ -124,10 +124,26 @@ func (s *safeService) GetDetail(id int, pid int) (viewmodels.SafeDetail, map[int
 	fileVM.Total = total
 	data.File = fileVM
 	auditors := s.daoSafeAudit.GetAuditorsWithOwner(safeData.Id, safeData.Times, account.Id)
+	encryptAuditors := make([]viewmodels.Auditors, 0)
+	for _, item := range auditors {
+		auditorVM := viewmodels.Auditors{}
+		auditId, _ := comm.AesEncrypt(item.AuditId, conf.SignSecret)
+		auditorVM.AuditId = auditId
+		auditorVM.Name = item.Name
+		auditorVM.Position = item.Position
+		auditorVM.Progress = item.Progress
+		encryptAuditors = append(encryptAuditors, auditorVM)
+	}
 	auditHistory := s.daoSafeAudit.GetAuditHistory(safeData.Id, safeData.Times)
-	data.Auditors = auditors
+	data.AuditHistory = auditHistory
+	rectifiedInfo, _ := s.daoSafeAudit.GetLastedOrder(safeData.Id)
+	data.RectifiedInfo = rectifiedInfo
+
+	latestAuditor, _ := s.daoSafeAudit.GetLastedAuditor(safeData.Times, safeData.Id)
+	data.LatestdAuditor = latestAuditor
+	data.Auditors = encryptAuditors
 
-	return data, auditHistory
+	return data
 }
 
 // 规则校验

+ 4 - 5
web/api/safe_api.go

@@ -184,12 +184,11 @@ func (c *SafeApi) GetDetail() {
 		return
 	}
 	pid, _ := utils.GetProjectId(c.Ctx)
-	SafeData, History := c.ServiceSafe.GetDetail(id, pid)
+	SafeData := c.ServiceSafe.GetDetail(id, pid)
 
 	c.Ctx.JSON(iris.Map{
-		"code":         0,
-		"msg":          "请求成功",
-		"data":         SafeData,
-		"auditHistory": History,
+		"code": 0,
+		"msg":  "请求成功",
+		"data": SafeData,
 	})
 }

+ 58 - 1
web/api/safe_audit_api.go

@@ -69,6 +69,62 @@ func (c *SafeAuditApi) PostAdd() {
 	})
 }
 
+// @Summary 开始审批
+// @Tags 安全巡检-审批
+// @Description 开始审批
+// @Accept  json
+// @Produce  json
+// @Security ApiKeyAuth
+// @Param   safe_id     body    string     true        "质量巡检id"
+// @Param   bidsection_id     body    string     true        "标段id"
+// @Param   auditors     body    array     true        "审核组"
+// @Param   reAuditors     body    array     true        "复查组"
+// @Success 200 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
+// @Failure 400 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
+// @Router /api/safe_audit/start [post]
+func (c *SafeAuditApi) PostStart() {
+	// 1.规则验证
+	safeAuditData, err := c.SafeAuditService.ValidStart(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	bidsectionId, err := utils.GetDecryptId(safeAuditData.BidsectionId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "ReadJSON转换异常,请检查参数"})
+		return
+	}
+	safeId, err := utils.GetDecryptId(safeAuditData.SafeId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "ReadJSON转换异常,请检查参数"})
+		return
+	}
+	var auditors []int
+	for _, item := range safeAuditData.Auditors {
+		auditId, _ := utils.GetDecryptId(item)
+		auditors = append(auditors, auditId)
+	}
+	var reAuditors []int
+	for _, item := range safeAuditData.ReAuditors {
+		auditId, _ := utils.GetDecryptId(item)
+		reAuditors = append(reAuditors, auditId)
+	}
+	uid, err := utils.GetProjectAccountId(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	err = c.SafeAuditService.StartAudit(safeId, bidsectionId, safeAuditData.Times, auditors, reAuditors, uid)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	c.Ctx.JSON(iris.Map{
+		"code": 0,
+		"msg":  "插入成功",
+	})
+}
+
 // @Summary 关闭审批流程
 // @Tags 安全巡检-审批
 // @Description 直接停止审批流程
@@ -183,6 +239,7 @@ func (c *SafeAuditApi) PostBack() {
 // @Param   safe_id     body    string		true		"巡检id"
 // @Param   audit_id    body    string		false		"整改人id"
 // @Param 	opinion			body 		string		false		"审批意见"
+// @Param   rectifiedInfo body string false "整改情况"
 // @Success 200 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
 // @Failure 400 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
 // @Router /api/safe_audit/pass [post]
@@ -215,7 +272,7 @@ func (c *SafeAuditApi) PostPass() {
 		return
 	}
 	// 4. 执行sql
-	err = c.SafeAuditService.PassAudit(id, uid, auditId, safeAuditData.Opinion)
+	err = c.SafeAuditService.PassAudit(id, uid, auditId, safeAuditData.Opinion, safeAuditData.RectifiedInfo)
 	if err != nil {
 		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
 		return

+ 17 - 11
web/viewmodels/safe.go

@@ -45,16 +45,19 @@ type SafeDetail struct {
 	Id           string `form:"id" json:"id" `
 	BidsectionId string `form:"bidsectionId" json:"bidsectionId"`
 
-	Code             string     `form:"code" json:"code"`
-	CreateTime       time.Time  `form:"createTime" json:"createTime"`
-	Position         string     `form:"position" json:"position"`
-	Inspection       string     `form:"inspection" json:"inspection"`
-	InspectionDetail string     `form:"inspectionDetail" json:"inspectionDetail"`
-	Demand           string     `form:"demand" json:"demand"`
-	Status           int        `form:"status" json:"status"`
-	AuditName        string     `form:"auditName" json:"auditName"`
-	File             FileStruct `form:"file" json:"file"`
-	Auditors         []Auditors `form:"auditors" json:"auditors"`
+	Code             string                     `form:"code" json:"code"`
+	CreateTime       time.Time                  `form:"createTime" json:"createTime"`
+	Position         string                     `form:"position" json:"position"`
+	Inspection       string                     `form:"inspection" json:"inspection"`
+	InspectionDetail string                     `form:"inspectionDetail" json:"inspectionDetail"`
+	Demand           string                     `form:"demand" json:"demand"`
+	Status           int                        `form:"status" json:"status"`
+	AuditName        string                     `form:"auditName" json:"auditName"`
+	File             FileStruct                 `form:"file" json:"file"`
+	Auditors         []Auditors                 `form:"auditors" json:"auditors"`
+	AuditHistory     map[int][]HistorySafeAudit `from:"auditHistory" json:"auditHistory"`
+	RectifiedInfo    []CheckOrderVM             `from:"rectifiedInfo" json:"rectifiedInfo"`
+	LatestdAuditor   *LatestAuditorVM           `from:"latestAuditor" json:"latestAuditor"`
 }
 
 // 单独出一个struct方便分页使用
@@ -70,7 +73,10 @@ type SafeFile struct {
 	CreateTime  time.Time `from:"create_time" json:"createTime"`
 }
 type Auditors struct {
-	Name string `from:"name" json:"name"`
+	Name     string `from:"name" json:"name"`
+	Progress string `from:"progress" json:"progress"`
+	AuditId  string `from:"audit_id" json:"audit_id"`
+	Position string `from:"position" json:"position"`
 }
 
 type SafeListAuditRecord struct {

+ 46 - 13
web/viewmodels/safe_audit.go

@@ -13,27 +13,42 @@ import (
 )
 
 type SafeAudit struct {
-	Id           string    `form:"id" json:"id" `
-	SafeId       string    `form:"safe_id" json:"safe_id" `
-	BidsectionId string    `form:"bidsection_id" json:"bidsection_id" `
-	Times        int       `form:"times" json:"times" `
-	AuditId      string    `form:"audit_id" json:"audit_id" `
-	AuditOrder   int       `form:"audit_order" json:"audit_order" `
-	Status       int       `form:"status" json:"status" `
-	CreateTime   time.Time `form:"create_time" json:"create_time" `
-	EndTime      time.Time `form:"end_time" json:"end_time" `
-	Progress     string    `form:"progress" json:"progress" `
-	Opinion      string    `form:"opinion" json:"opinion" `
+	Id            string    `form:"id" json:"id"`
+	SafeId        string    `form:"safe_id" json:"safe_id"`
+	BidsectionId  string    `form:"bidsection_id" json:"bidsection_id"`
+	Times         int       `form:"times" json:"times"`
+	AuditId       string    `form:"audit_id" json:"audit_id"`
+	AuditOrder    int       `form:"audit_order" json:"audit_order"`
+	Status        int       `form:"status" json:"status"`
+	CreateTime    time.Time `form:"create_time" json:"create_time"`
+	EndTime       time.Time `form:"end_time" json:"end_time"`
+	Progress      string    `form:"progress" json:"progress"`
+	Opinion       string    `form:"opinion" json:"opinion"`
+	RectifiedInfo string    `form:"rectifiedInfo" json:"rectifiedInfo"`
 }
 
 type HistorySafeAudit struct {
-	Id         string    `from:"Id" json:"Id"`
+	Id         string    `from:"id" json:"id"`
 	Name       string    `from:"name" json:"name"`
 	Position   string    `from:"position" json:"position"`
 	Createtime time.Time `from:"create_time" json:"create_time"`
 	EndTime    time.Time `from:"end_time" json:"end_time"`
 	Opinion    string    `from:"opinion" json:"opinion"`
-	Status     int       `fron:"status" json:"status"`
+	Status     int       `from:"status" json:"status"`
+}
+
+type LatestAuditorVM struct {
+	AuditId  string `fron:"audit_id" json:"audit_id"`
+	Status   int    `from:"status" json:"status"`
+	Progress string `form:"progress" json:"progress" `
+}
+
+// 整改单
+type CheckOrderVM struct {
+	Name    string    `from:"name" json:"name"`
+	EndTime time.Time `from:"end_time" json:"end_time"`
+	Opinion string    `from:"opinion" json:"opinion"`
+	Status  int       `from:"status" json:"status"`
 }
 
 func (l SafeAudit) ValidateAddAuditor() error {
@@ -65,3 +80,21 @@ func (l SafeAudit) ValidatePass() error {
 		validation.Field(&l.SafeId, validation.Required.Error("巡检id不能为空")),
 	)
 }
+
+type AuditStart struct {
+	SafeId       string   `form:"safe_id" json:"safe_id"`
+	BidsectionId string   `form:"bidsection_id" json:"bidsection_id"`
+	Times        int      `form:"times" json:"times"`
+	Auditors     []string `form:"auditors" json:"auditors"`
+	ReAuditors   []string `form:"reAuditors" json:"reAuditors"`
+}
+
+func (l AuditStart) ValidateStart() error {
+	return validation.ValidateStruct(&l,
+		validation.Field(&l.BidsectionId, validation.Required.Error("标段id不能为空")),
+		validation.Field(&l.SafeId, validation.Required.Error("巡检id不能为空")),
+		validation.Field(&l.Times, validation.Required.Error("审批次数不能为空")),
+		validation.Field(&l.Auditors, validation.Required.Error("审批组不能为空")),
+		validation.Field(&l.ReAuditors, validation.Required.Error("复查组不能为空")),
+	)
+}