Browse Source

报告审批消息

hsun 4 months ago
parent
commit
24440a16e9
3 changed files with 379 additions and 14 deletions
  1. 3 3
      controllers/base_open.go
  2. 164 11
      controllers/report_open.go
  3. 212 0
      models/report_message.go

+ 3 - 3
controllers/base_open.go

@@ -28,21 +28,21 @@ func (this *BaseOpenController) Prepare() {
 
 		if nonce == "" {
 			errMsg := "随机字符串不能为空"
-			this.JSON(models.BaseResponse{Ret: 400, Msg: "", ErrMsg: errMsg}, false, false)
+			this.JSON(models.BaseResponse{Ret: 400, Msg: errMsg, ErrMsg: errMsg}, false, false)
 			this.StopRun()
 			return
 		}
 
 		if timestamp == "" {
 			errMsg := "时间戳不能为空"
-			this.JSON(models.BaseResponse{Ret: 400, Msg: "", ErrMsg: errMsg}, false, false)
+			this.JSON(models.BaseResponse{Ret: 400, Msg: errMsg, ErrMsg: errMsg}, false, false)
 			this.StopRun()
 			return
 		}
 
 		if appid != utils.AppId {
 			errMsg := "AppId错误,请核查"
-			this.JSON(models.BaseResponse{Ret: 400, Msg: "", ErrMsg: errMsg}, false, false)
+			this.JSON(models.BaseResponse{Ret: 400, Msg: errMsg, ErrMsg: errMsg}, false, false)
 			this.StopRun()
 			return
 		}

+ 164 - 11
controllers/report_open.go

@@ -6,6 +6,7 @@ import (
 	"eta_gn/eta_report/services"
 	"eta_gn/eta_report/utils"
 	"fmt"
+	"strconv"
 	"strings"
 	"time"
 )
@@ -284,7 +285,7 @@ func (this *ReportOpenController) ReportApprove() {
 		return
 	}
 
-	// 先做校验后执行
+	// 先做校验后执行, 报告很可能是研报和PPT类型混着一起审批的
 	updateReports := make([]*models.Report, 0)
 	updatePpts := make([]*models.PptV2, 0)
 	for _, v := range req.ReportIds {
@@ -314,46 +315,198 @@ func (this *ReportOpenController) ReportApprove() {
 		}
 	}
 
+	// 审批人
+	approveUser := new(models.Admin)
+	{
+		ob := new(models.Admin)
+		cond := ` AND out_id = ?`
+		pars := make([]interface{}, 0)
+		pars = append(pars, req.ApproveUser)
+		admin, e := ob.GetItemByCondition(cond, pars, "")
+		if e != nil && !utils.IsErrNoRow(e) {
+			br.Msg = "操作失败"
+			br.ErrMsg = fmt.Sprintf("获取审批人信息失败, %v", e)
+			return
+		}
+		if admin != nil && admin.AdminId > 0 {
+			approveUser = admin
+		}
+	}
+	if approveUser.AdminId == 0 {
+		utils.FileLog.Info(fmt.Sprintf("ReportApprove-无审批人信息, OutId: %s", req.ApproveUser))
+	}
+
+	reportMessages := make([]*models.ReportMessage, 0)
 	afterApproveMap := map[int]int{
 		1: models.ReportStatePass,
 		2: models.ReportStateRefused,
 		3: models.ReportStateWaitSubmit,
 	}
-	updateCols := []string{"State", "ApproveTime", "ModifyTime"}
 	if len(updateReports) > 0 {
 		for _, v := range updateReports {
+			updateCols := []string{"State", "ModifyTime"}
 			v.State = afterApproveMap[req.ApproveType]
-			if v.State == models.ReportStateRefused || v.State == models.ReportStatePass {
+			v.ModifyTime = time.Now()
+			if v.State == models.ReportStatePass || v.State == models.ReportStateRefused {
 				v.ApproveTime = time.Now()
-			} else {
-				v.ApproveTime = time.Time{}
+				updateCols = append(updateCols, "ApproveTime")
 			}
-			v.ModifyTime = time.Now()
 			if e := v.Update(updateCols); e != nil {
 				br.Msg = "操作失败"
 				br.ErrMsg = fmt.Sprintf("更新报告状态失败, %v", e)
 				return
 			}
+			if req.ApproveType == 3 {
+				// 撤回暂不发消息
+				continue
+			}
+
+			// 创作人和协作人
+			userIds := make([]int, 0)
+			userIds = append(userIds, v.AdminId)
+			{
+				grantOb := new(models.ReportGrant)
+				grantCond := ` AND report_id = ?`
+				grantPars := make([]interface{}, 0)
+				grantPars = append(grantPars, v.Id)
+				grants, e := grantOb.GetItemsByCondition(grantCond, grantPars, []string{"admin_id"}, "")
+				if e != nil {
+					br.Msg = "操作失败"
+					br.ErrMsg = fmt.Sprintf("获取报告协作人失败, %v", e)
+					return
+				}
+				for _, v := range grants {
+					if utils.InArrayByInt(userIds, v.AdminId) {
+						continue
+					}
+					userIds = append(userIds, v.AdminId)
+				}
+			}
+
+			// 发送系统消息给创建人和协作人
+			var messageType int
+			var tips string
+			var extraContent string
+			if v.State == models.ReportStatePass {
+				messageType = models.ReportMessageTypeApprovePass
+				tips = "已通过审批!"
+			}
+			if v.State == models.ReportStateRefused {
+				messageType = models.ReportMessageTypeApproveRefuse
+				tips = "已被驳回,点击查看详情!"
+				// 审批详情信息
+				var extra models.ReportMessageApproveItem
+				extra.Title = v.Title
+				extra.ApproveType = 2
+				extra.ApproveUserId = approveUser.AdminId
+				extra.ApproveUserName = approveUser.RealName
+				extra.ApproveRemark = req.Suggestion
+				b, e := json.Marshal(extra)
+				if e != nil {
+					br.Msg = "操作失败"
+					br.ErrMsg = fmt.Sprintf("消息通知-审批信息JSON格式化失败, %v", e)
+					return
+				}
+				extraContent = string(b)
+			}
+			for _, u := range userIds {
+				m := new(models.ReportMessage)
+				m.SendUserId = approveUser.AdminId
+				m.ReceiveUserId = u
+				m.Content = fmt.Sprintf("您提交的【%s】%s", v.Title, tips)
+				m.ExtraContent = extraContent
+				m.ReportType = utils.ReportTypeDefault
+				m.ReportId = v.Id
+				m.MessageType = messageType
+				m.CreateTime = time.Now()
+				m.ModifyTime = time.Now()
+				reportMessages = append(reportMessages, m)
+			}
 		}
 	}
 	if len(updatePpts) > 0 {
 		for _, v := range updatePpts {
+			updateCols := []string{"State", "ModifyTime"}
 			v.State = afterApproveMap[req.ApproveType]
-			if v.State == models.ReportStateRefused || v.State == models.ReportStatePass {
+			v.ModifyTime = time.Now()
+			if v.State == models.ReportStatePass || v.State == models.ReportStateRefused {
 				v.ApproveTime = time.Now()
-			} else {
-				v.ApproveTime = time.Time{}
+				updateCols = append(updateCols, "ApproveTime")
 			}
-			v.ModifyTime = time.Now()
 			if e := v.Update(updateCols); e != nil {
 				br.Msg = "操作失败"
 				br.ErrMsg = fmt.Sprintf("更新报告状态失败, %v", e)
 				return
 			}
+			if req.ApproveType == 3 {
+				// 撤回暂不发消息
+				continue
+			}
+
+			// 创建人和协作人
+			userIds := make([]int, 0)
+			userIds = append(userIds, v.AdminId)
+			if v.CollaborateUsers != "" {
+				partnerArr := strings.Split(v.CollaborateUsers, ",")
+				for _, p := range partnerArr {
+					uid, _ := strconv.Atoi(p)
+					if uid > 0 && !utils.InArrayByInt(userIds, uid) {
+						userIds = append(userIds, uid)
+					}
+				}
+			}
+
+			// 发送系统消息给创建人和协作人
+			var messageType int
+			var tips string
+			var extraContent string
+			if v.State == models.ReportStatePass {
+				messageType = models.ReportMessageTypeApprovePass
+				tips = "已通过审批!"
+			}
+			if v.State == models.ReportStateRefused {
+				messageType = models.ReportMessageTypeApproveRefuse
+				tips = "已被驳回,点击查看详情!"
+				// 审批详情信息
+				var extra models.ReportMessageApproveItem
+				extra.Title = v.Title
+				extra.ApproveType = 2
+				extra.ApproveUserId = approveUser.AdminId
+				extra.ApproveUserName = approveUser.RealName
+				extra.ApproveRemark = req.Suggestion
+				b, e := json.Marshal(extra)
+				if e != nil {
+					br.Msg = "操作失败"
+					br.ErrMsg = fmt.Sprintf("消息通知-审批信息JSON格式化失败, %v", e)
+					return
+				}
+				extraContent = string(b)
+			}
+			for _, u := range userIds {
+				m := new(models.ReportMessage)
+				m.SendUserId = approveUser.AdminId
+				m.ReceiveUserId = u
+				m.Content = fmt.Sprintf("您提交的【%s】%s", v.Title, tips)
+				m.ExtraContent = extraContent
+				m.ReportType = utils.ReportTypePPT
+				m.ReportId = v.PptId
+				m.MessageType = messageType
+				m.CreateTime = time.Now()
+				m.ModifyTime = time.Now()
+				reportMessages = append(reportMessages, m)
+			}
 		}
 	}
 
-	// TODO:消息通知
+	// 消息通知
+	if len(reportMessages) > 0 {
+		messageOb := new(models.ReportMessage)
+		if e := messageOb.CreateMulti(reportMessages); e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = fmt.Sprintf("批量新增报告消息失败, %v", e)
+			return
+		}
+	}
 
 	br.Ret = 200
 	br.Success = true

+ 212 - 0
models/report_message.go

@@ -0,0 +1,212 @@
+package models
+
+import (
+	"eta_gn/eta_report/global"
+	"eta_gn/eta_report/utils"
+	"fmt"
+	"strings"
+	"time"
+
+	"github.com/rdlucklib/rdluck_tools/paging"
+)
+
+const (
+	ReportMessageTypeWriteNotice   = 1 // 撰写通知
+	ReportMessageTypeApprovePass   = 2 // 审批通过
+	ReportMessageTypeApproveRefuse = 3 // 审批驳回
+)
+
+type ReportMessage struct {
+	Id            int       `gorm:"primaryKey;column:id;type:int(10) unsigned;not null"`
+	SendUserId    int       `gorm:"column:send_user_id" description:"发送人ID"`
+	ReceiveUserId int       `gorm:"column:receive_user_id" description:"接受者ID"`
+	Content       string    `gorm:"column:content" description:"消息内容"`
+	Remark        string    `gorm:"column:remark" description:"备注信息"`
+	ExtraContent  string    `gorm:"column:extra_content" description:"额外信息-JSON"`
+	ReportType    int       `gorm:"column:report_type" description:"报告类型:1-研报;2-PPT"`
+	ReportId      int       `gorm:"column:report_id" description:"报告/PPT-ID"`
+	MessageType   int       `gorm:"column:message_type" description:"消息类型:1-撰写通知;2-审批通过;3-审批驳回"`
+	IsRead        int       `gorm:"column:is_read" description:"是否已读:0-未读;1-已读"`
+	CreateTime    time.Time `gorm:"column:create_time" description:"消息时间"`
+	ModifyTime    time.Time `gorm:"column:modify_time" description:"更新时间"`
+}
+
+var ReportMessageCols = struct {
+	Id            string
+	SendUserId    string
+	ReceiveUserId string
+	Content       string
+	Remark        string
+	ExtraContent  string
+	ReportType    string
+	ReportId      string
+	MessageType   string
+	IsRead        string
+	CreateTime    string
+}{
+	Id:            "id",
+	SendUserId:    "send_user_id",
+	ReceiveUserId: "receive_user_id",
+	Content:       "content",
+	Remark:        "remark",
+	ExtraContent:  "extra_content",
+	ReportType:    "report_type",
+	ReportId:      "report_id",
+	MessageType:   "message_type",
+	IsRead:        "is_read",
+	CreateTime:    "create_time",
+}
+
+func (m *ReportMessage) TableName() string {
+	return "report_message"
+}
+
+func (m *ReportMessage) PrimaryId() string {
+	return ReportMessageCols.Id
+}
+
+func (m *ReportMessage) Create() (err error) {
+	err = global.DEFAULT_DmSQL.Create(m).Error
+	return
+}
+
+func (m *ReportMessage) CreateMulti(items []*ReportMessage) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	err = global.DEFAULT_DmSQL.CreateInBatches(items, utils.MultiAddNum).Error
+	return
+}
+
+func (m *ReportMessage) Update(cols []string) (err error) {
+	err = global.DEFAULT_DmSQL.Select(cols).Updates(m).Error
+	return
+}
+
+func (m *ReportMessage) Del() (err error) {
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
+	err = global.DEFAULT_DmSQL.Exec(sql, m.Id).Error
+	return
+}
+
+func (m *ReportMessage) MultiDel(menuIds []int) (err error) {
+	if len(menuIds) == 0 {
+		return
+	}
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.PrimaryId(), utils.GetOrmInReplace(len(menuIds)))
+	err = global.DEFAULT_DmSQL.Exec(sql, menuIds).Error
+	return
+}
+
+func (m *ReportMessage) GetItemById(id int) (item *ReportMessage, err error) {
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
+	err = global.DEFAULT_DmSQL.Raw(sql, id).First(&item).Error
+	return
+}
+
+func (m *ReportMessage) GetItemByCondition(condition string, pars []interface{}, orderRule string) (item *ReportMessage, err error) {
+	order := ``
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s %s LIMIT 1`, m.TableName(), condition, order)
+	err = global.DEFAULT_DmSQL.Raw(sql, pars...).First(&item).Error
+	return
+}
+
+func (m *ReportMessage) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
+	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
+	err = global.DEFAULT_DmSQL.Raw(sql, pars...).Scan(&count).Error
+	return
+}
+
+func (m *ReportMessage) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*ReportMessage, err error) {
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
+	err = global.DEFAULT_DmSQL.Raw(sql, pars...).Find(&items).Error
+	return
+}
+
+func (m *ReportMessage) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*ReportMessage, err error) {
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
+	pars = append(pars, startSize)
+	pars = append(pars, pageSize)
+	err = global.DEFAULT_DmSQL.Raw(sql, pars...).Find(&items).Error
+	return
+}
+
+// ReportMessageItem 报告消息
+type ReportMessageItem struct {
+	Id            int
+	SendUserId    int                       `description:"发送人ID"`
+	ReceiveUserId int                       `description:"接收者ID"`
+	Content       string                    `description:"消息内容"`
+	Remark        string                    `description:"备注信息"`
+	ReportType    int                       `description:"报告类型:1-研报;2-PPT"`
+	ReportId      int                       `description:"报告/PPT-ID"`
+	ReportState   int                       `description:"报告当前状态"`
+	MessageType   int                       `description:"消息类型:1-撰写通知;2-审批通过;3-审批驳回"`
+	IsRead        int                       `description:"是否已读:0-未读;1-已读"`
+	CreateTime    string                    `description:"消息时间"`
+	ApproveMsg    *ReportMessageApproveItem `description:"审批信息"`
+}
+
+// ReportMessageApproveItem 报告消息审批内容
+type ReportMessageApproveItem struct {
+	Title           string `description:"报告标题"`
+	ApproveType     int    `description:"审批类型:1-通过;2-驳回"`
+	ApproveUserId   int    `description:"审批人ID"`
+	ApproveUserName string `description:"审批人"`
+	ApproveRemark   string `description:"审批备注(驳回意见)"`
+}
+
+// FormatReportMessage2Item 格式化报告消息
+func FormatReportMessage2Item(origin *ReportMessage) (item *ReportMessageItem) {
+	item = new(ReportMessageItem)
+	if origin == nil {
+		return
+	}
+	item.Id = origin.Id
+	item.SendUserId = origin.SendUserId
+	item.ReceiveUserId = origin.ReceiveUserId
+	item.Content = origin.Content
+	item.Remark = origin.Remark
+	item.ReportType = origin.ReportType
+	item.ReportId = origin.ReportId
+	item.IsRead = origin.IsRead
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	return
+}
+
+// ReportMessageListReq 消息列表请求参数
+type ReportMessageListReq struct {
+	PageSize     int `form:"PageSize"`
+	CurrentIndex int `form:"CurrentIndex"`
+}
+
+// ReportMessageListResp 消息列表响应体
+type ReportMessageListResp struct {
+	List        []*ReportMessageItem
+	Paging      *paging.PagingItem `description:"分页数据"`
+	UnreadTotal int                `description:"消息未读数"`
+}
+
+// ReportMessageReadReq 消息已读请求体
+type ReportMessageReadReq struct {
+	MessageId int `description:"消息ID"`
+}