xu 6 months ago
parent
commit
907d2ba456

+ 2 - 0
server/api/v1/system/enter.go

@@ -13,6 +13,7 @@ type ApiGroup struct {
 	OperationRecordApi
 	DictionaryDetailApi
 	AuthorityBtnApi
+	NoticeApi
 }
 
 var (
@@ -27,4 +28,5 @@ var (
 	operationRecordService  = service.ServiceGroupApp.SystemServiceGroup.OperationRecordService
 	dictionaryDetailService = service.ServiceGroupApp.SystemServiceGroup.DictionaryDetailService
 	authorityBtnService     = service.ServiceGroupApp.SystemServiceGroup.AuthorityBtnService
+	noticeService           = service.ServiceGroupApp.SystemServiceGroup.NoticeService
 )

+ 106 - 0
server/api/v1/system/notice.go

@@ -0,0 +1,106 @@
+package system
+
+import (
+	"github.com/gin-gonic/gin"
+	"server/dao"
+	"server/global"
+	"server/model/common/response"
+	"strconv"
+)
+
+type NoticeApi struct{}
+
+func (na *NoticeApi) QueryUserUnreadNotice(c *gin.Context) {
+	id := c.Query("id")
+	userId, err := strconv.Atoi(id)
+	if err != nil {
+		response.FailWithMessage("参数错误", c)
+		global.GVA_LOG.Error("QueryUserUnreadNotice ====== " + err.Error())
+		return
+	}
+	noticeList, err := noticeService.QueryUserUnreadNotice(userId)
+	if err != nil {
+		response.FailWithMessage("查询失败", c)
+		global.GVA_LOG.Error("QueryUserUnreadNotice ====== " + err.Error())
+		return
+	}
+	response.OkWithData(noticeList, c)
+}
+
+func (na *NoticeApi) QueryAllNotices(c *gin.Context) {
+	noticeList, err := noticeService.QueryAllNotices()
+	if err != nil {
+		response.FailWithMessage("查询失败", c)
+		global.GVA_LOG.Error("QueryAllNotices ====== " + err.Error())
+		return
+	}
+	response.OkWithData(noticeList, c)
+}
+
+func (na *NoticeApi) CreateNotice(c *gin.Context) {
+	var notice dao.Notice
+	err := c.ShouldBindJSON(&notice)
+	if err != nil {
+		response.FailWithMessage("参数错误", c)
+		global.GVA_LOG.Error("CreateNotice ====== " + err.Error())
+		return
+	}
+	err = noticeService.CreateNotice(notice)
+	if err != nil {
+		response.FailWithMessage("创建失败", c)
+		global.GVA_LOG.Error("CreateNotice ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("创建成功", c)
+}
+
+func (na *NoticeApi) ReadNotice(c *gin.Context) {
+	id := c.Query("id")
+	noticeId, err := strconv.Atoi(id)
+	if err != nil {
+		response.FailWithMessage("参数错误", c)
+		global.GVA_LOG.Error("ReadNotice ====== " + err.Error())
+		return
+	}
+	err = noticeService.ReadNotice(noticeId)
+	if err != nil {
+		response.FailWithMessage("标记已读失败", c)
+		global.GVA_LOG.Error("ReadNotice ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("标记已读成功", c)
+}
+
+func (na *NoticeApi) UpdateNotice(c *gin.Context) {
+	var notice dao.Notice
+	err := c.ShouldBindJSON(&notice)
+	if err != nil {
+		response.FailWithMessage("参数解析失败", c)
+		global.GVA_LOG.Error("UpdateNotice ====== " + err.Error())
+		return
+	}
+	err = noticeService.UpdateNotice(notice)
+	if err != nil {
+		response.FailWithMessage("更新失败", c)
+		global.GVA_LOG.Error("UpdateNotice ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("更新成功", c)
+}
+
+func (na *NoticeApi) DeleteNotice(c *gin.Context) {
+	var notice dao.Notice
+	err := c.ShouldBindJSON(&notice)
+	if err != nil {
+		response.FailWithMessage("参数解析失败", c)
+		global.GVA_LOG.Error("DeleteNotice ====== " + err.Error())
+		return
+	}
+	err = noticeService.DeleteNotice(notice)
+	if err != nil {
+		response.FailWithMessage("删除失败", c)
+		global.GVA_LOG.Error("DeleteNotice ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("删除成功", c)
+}

+ 18 - 0
server/api/v1/workflow/description.go

@@ -4,6 +4,7 @@ import (
 	"github.com/gin-gonic/gin"
 	"server/dao"
 	"server/global"
+	"server/model/common/request"
 	"server/model/common/response"
 	"strconv"
 )
@@ -94,3 +95,20 @@ func (da *DescriptionApi) DeleteDescription(c *gin.Context) {
 	}
 	response.OkWithMessage("删除成功", c)
 }
+
+func (da *DescriptionApi) ProcessOperate(c *gin.Context) {
+	var operateRecord request.OperateRecord
+	err := c.ShouldBindJSON(&operateRecord)
+	if err != nil {
+		response.FailWithMessage("参数错误", c)
+		global.GVA_LOG.Error("ProcessOperate ====== " + err.Error())
+		return
+	}
+	err = descriptionService.ProcessOperate(operateRecord.ProjectProcess, operateRecord.Description)
+	if err != nil {
+		response.FailWithMessage("操作失败", c)
+		global.GVA_LOG.Error("ProcessOperate ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("操作成功", c)
+}

+ 10 - 0
server/api/v1/workflow/node.go

@@ -87,6 +87,11 @@ func (na *NodeApi) UpdateNode(c *gin.Context) {
 	}
 	err = nodeService.UpdateNode(node)
 	if err != nil {
+		if err.Error() == "节点被使用过" {
+			response.FailWithMessage("节点被使用过", c)
+			global.GVA_LOG.Error("UpdateNode ====== " + err.Error())
+			return
+		}
 		response.FailWithMessage("更新失败", c)
 		global.GVA_LOG.Error("UpdateNode ====== " + err.Error())
 		return
@@ -104,6 +109,11 @@ func (na *NodeApi) DeleteNode(c *gin.Context) {
 	}
 	err = nodeService.DeleteNode(node)
 	if err != nil {
+		if err.Error() == "节点被使用过" {
+			response.FailWithMessage("节点被使用过", c)
+			global.GVA_LOG.Error("UpdateNode ====== " + err.Error())
+			return
+		}
 		response.FailWithMessage("删除失败", c)
 		global.GVA_LOG.Error("DeleteNode ====== " + err.Error())
 		return

+ 11 - 0
server/api/v1/workflow/project_process.go

@@ -19,6 +19,12 @@ func (ppa *ProjectProcessApi) QueryProjectApplicantList(c *gin.Context) {
 		global.GVA_LOG.Error("QueryProjectApplicantList ====== " + err.Error())
 		return
 	}
+	if info.UserId == 0 {
+		response.FailWithMessage("请传用户编号", c)
+		global.GVA_LOG.Error("QueryProjectApplicantList ====== " + err.Error())
+		return
+	}
+
 	list, total, err := projectProcessService.QueryProjectApplicantList(info)
 	if err != nil {
 		response.FailWithMessage("查询失败", c)
@@ -41,6 +47,11 @@ func (ppa *ProjectProcessApi) QueryProjectProcessList(c *gin.Context) {
 		global.GVA_LOG.Error("QueryProjectProgressList ====== " + err.Error())
 		return
 	}
+	if info.UserId == 0 {
+		response.FailWithMessage("请传用户编号", c)
+		global.GVA_LOG.Error("QueryProjectApplicantList ====== " + err.Error())
+		return
+	}
 	list, total, err := projectProcessService.QueryProjectProcessList(info)
 	if err != nil {
 		response.FailWithMessage("查询失败", c)

+ 13 - 9
server/dao/description.go

@@ -46,6 +46,7 @@ func ProcessOperate(projectProcess ProjectProcess, description Description) (err
 	//下个节点
 	var lastNode Node
 	for _, node := range projectProcess.Process.Nodes {
+
 		if node.ID == projectProcess.Node.ID {
 			currentNode = node
 		}
@@ -55,10 +56,10 @@ func ProcessOperate(projectProcess ProjectProcess, description Description) (err
 
 	}
 	// 当是最后一步时进行通过的操作
-	if lastNode.Order == len(projectProcess.Process.Nodes) && description.ApprovalOpinion == "通过" {
+	if currentNode.Order == len(projectProcess.Process.Nodes) && description.OptionResult == "通过" {
 
 		// 审批通过后,修改所属项目流程的状态
-		err = global.GVA_DB.Model(&projectProcess).Update("state", 1).Error
+		err = global.GVA_DB.Model(&ProjectProcess{}).Where("id = ?", projectProcess.ID).Update("state", 1).Error
 		if err != nil {
 			return err
 		}
@@ -79,7 +80,7 @@ func ProcessOperate(projectProcess ProjectProcess, description Description) (err
 	}
 
 	// 当是最后一步时进行打回的操作
-	if lastNode.Order == len(projectProcess.Process.Nodes) && description.ApprovalOpinion == "打回" {
+	if currentNode.Order == len(projectProcess.Process.Nodes) && description.OptionResult == "打回" {
 
 		//流程记录保存
 		err = description.CreateDescription()
@@ -91,10 +92,10 @@ func ProcessOperate(projectProcess ProjectProcess, description Description) (err
 	}
 
 	// 当是最后一步时进行拒绝的操作
-	if lastNode.Order == len(projectProcess.Process.Nodes) && description.ApprovalOpinion == "拒绝" {
+	if currentNode.Order == len(projectProcess.Process.Nodes) && description.OptionResult == "拒绝" {
 
 		// 审批通过后,修改所属项目流程的状态
-		err = global.GVA_DB.Model(&projectProcess).Update("state", 2).Error
+		err = global.GVA_DB.Model(&ProjectProcess{}).Where("id = ?", projectProcess.ID).Update("state", 2).Error
 		if err != nil {
 			return err
 		}
@@ -108,9 +109,11 @@ func ProcessOperate(projectProcess ProjectProcess, description Description) (err
 		return err
 	}
 
-	if currentNode.Order == lastNode.Order+1 && description.ApprovalOpinion == "通过" {
+	// 最后之前才会到达 如果为最后在上面完成后会return出去
+	if description.OptionResult == "通过" {
+
 		// 节点通过后,修改所属项目流程的当前节点为下个节点
-		err = global.GVA_DB.Model(&projectProcess).Update("current_node_order", currentNode.ID).Error
+		err = global.GVA_DB.Model(&ProjectProcess{}).Where("id = ?", projectProcess.ID).Update("current_node_order", lastNode.ID).Error
 		if err != nil {
 			return err
 		}
@@ -123,10 +126,11 @@ func ProcessOperate(projectProcess ProjectProcess, description Description) (err
 
 		return err
 	}
+	//
+	if description.OptionResult == "拒绝" {
 
-	if currentNode.Order == lastNode.Order && description.ApprovalOpinion == "拒绝" {
 		// 审批通过后,修改所属项目流程的状态
-		err = global.GVA_DB.Model(&projectProcess).Update("state", 2).Error
+		err = global.GVA_DB.Model(&ProjectProcess{}).Where("id = ?", projectProcess.ID).Update("state", 2).Error
 		if err != nil {
 			return err
 		}

+ 7 - 7
server/dao/node.go

@@ -6,12 +6,12 @@ import (
 
 type Node struct {
 	global.GVA_MODEL
-	NodeName        string     `json:"nodeName" form:"nodeName" gorm:"comment:审批节点名称"`
-	ApproverId      int        `json:"approverId" form:"approverId" gorm:"comment:审批人id"`
-	Approver        SysUser    `json:"approver" form:"approver" gorm:"foreignKey:ApproverId;references:id;"`
-	NodeDescription string     `json:"nodeDescription" form:"nodeDescription" gorm:"comment:节点描述"`
-	Processes       []*Process `json:"processes" form:"processes" gorm:"many2many:process_nodes;"`
-	Order           int        `json:"order" form:"order" gorm:"-"`
+	NodeName        string    `json:"nodeName" form:"nodeName" gorm:"comment:审批节点名称"`
+	ApproverId      int       `json:"approverId" form:"approverId" gorm:"comment:审批人id"`
+	Approver        SysUser   `json:"approver" form:"approver" gorm:"foreignKey:ApproverId;references:id;"`
+	NodeDescription string    `json:"nodeDescription" form:"nodeDescription" gorm:"comment:节点描述"`
+	Processes       []Process `json:"processes" form:"processes" gorm:"many2many:process_nodes;"`
+	Order           int       `json:"order" form:"order" gorm:"-"`
 }
 
 func (Node) TableName() string {
@@ -46,7 +46,7 @@ func QueryNodeByApproverId(approverId int) (nodes []Node, err error) {
 }
 
 func QueryNodeAndProcess(id int) (processId []int, err error) {
-	err = global.GVA_DB.Table("process_nodes").Where("node_id = ?", id).Find(&processId).Error
+	err = global.GVA_DB.Table("process_nodes").Select("process_id").Where("node_id = ?", id).Find(&processId).Error
 	return processId, err
 }
 

+ 45 - 0
server/dao/notice.go

@@ -0,0 +1,45 @@
+package dao
+
+import "server/global"
+
+type Notice struct {
+	global.GVA_MODEL
+	Title   string  `json:"title" form:"title" gorm:"comment:标题"`
+	Content string  `json:"content" form:"content" gorm:"comment:内容"`
+	Type    string  `json:"type" form:"type" gorm:"comment:类型"`
+	UserId  int     `json:"userId" form:"userId" gorm:"comment:接收者ID"`
+	User    SysUser `json:"user" form:"user" gorm:"foreignKey:UserId;references:id;"`
+	IsRead  bool    `json:"isRead" form:"isRead" gorm:"default:false;comment:是否已读"`
+}
+
+func (Notice) TableName() string {
+	return "notice"
+}
+
+// QueryUserUnreadNotice 查询用户未读通知
+func QueryUserUnreadNotice(userId int) (notices []Notice, err error) {
+	err = global.GVA_DB.Where("user_id = ? AND is_read = ?", userId, false).Find(&notices).Error
+	return
+}
+
+// QueryAllNotices 查询所有通知
+func QueryAllNotices() (notices []Notice, err error) {
+	err = global.GVA_DB.Find(&notices).Error
+	return
+}
+
+func (n Notice) CreateNotice() error {
+	return global.GVA_DB.Create(&n).Error
+}
+
+func ReadNotice(id int) error {
+	return global.GVA_DB.Model(&Notice{}).Where("id =?", id).Update("is_read", true).Error
+}
+
+func (n Notice) UpdateNotice() error {
+	return global.GVA_DB.Model(&n).Updates(&n).Error
+}
+
+func (n Notice) DeleteNotice() error {
+	return global.GVA_DB.Unscoped().Delete(&n).Error
+}

+ 31 - 2
server/dao/project_process.go

@@ -15,6 +15,7 @@ type ProjectProcess struct {
 	ProjectType        string        `json:"projectType" form:"projectType" gorm:"comment:项目类型"`
 	Descriptions       []Description `json:"descriptions" form:"descriptions" gorm:"foreignKey:ProjectProcessId;"`
 	State              int           `json:"isOver" form:"isOver" gorm:"comment:状态;default:0;"`
+	Code               string        `json:"code" form:"code" gorm:"-"`
 }
 
 func (ProjectProcess) TableName() string {
@@ -52,7 +53,13 @@ func QueryProjectApplicantList(limit, offset, applicant int) (projectProcesses [
 			nodes = append(nodes, node1)
 		}
 		projectProcesses[i].Process.Nodes = nodes
-
+		//获取当前节点所有信息
+		var node Node
+		err = global.GVA_DB.Model(&Node{}).Where("id = ?", projectProcess.CurrentNodeOrder).Preload("Approver").First(&node).Error
+		projectProcesses[i].Node = node
+		var processNode ProcessNodes
+		err = global.GVA_DB.Model(&ProcessNodes{}).Where("process_id = ? and node_id = ?", projectProcess.Process.ID, node.ID).First(&processNode).Error
+		projectProcesses[i].Node.Order = processNode.NodeOrder
 	}
 
 	return projectProcesses, total, err
@@ -86,7 +93,13 @@ func QueryProjectProcessList(limit, offset, applicant int) (projectProcesses []P
 			nodes = append(nodes, node1)
 		}
 		projectProcesses[i].Process.Nodes = nodes
-
+		//获取当前节点所有信息
+		var node Node
+		err = global.GVA_DB.Model(&Node{}).Where("id = ?", projectProcess.CurrentNodeOrder).Preload("Approver").First(&node).Error
+		projectProcesses[i].Node = node
+		var processNode ProcessNodes
+		err = global.GVA_DB.Model(&ProcessNodes{}).Where("process_id = ? and node_id = ?", projectProcess.Process.ID, node.ID).First(&processNode).Error
+		projectProcesses[i].Node.Order = processNode.NodeOrder
 	}
 
 	return projectProcesses, total, err
@@ -111,6 +124,22 @@ func QueryProjectProcessById(id int) (projectProcess ProjectProcess, err error)
 		nodes = append(nodes, node1)
 	}
 	projectProcess.Process.Nodes = nodes
+	//获取当前节点所有信息
+	var node Node
+	err = global.GVA_DB.Model(&Node{}).Where("id = ?", projectProcess.CurrentNodeOrder).Preload("Approver").First(&node).Error
+	projectProcess.Node = node
+	var processNode ProcessNodes
+	err = global.GVA_DB.Model(&ProcessNodes{}).Where("process_id = ? and node_id = ?", projectProcess.Process.ID, node.ID).First(&processNode).Error
+	projectProcess.Node.Order = processNode.NodeOrder
+	//当项目类型为立项时
+	if projectProcess.ProjectType == "立项" {
+		var project Project
+		err = global.GVA_DB.Model(&Project{}).Where("id = ?", projectProcess.ProjectId).First(&project).Error
+		if err != nil {
+			return projectProcess, err
+		}
+		projectProcess.Code = project.Code
+	}
 
 	return projectProcess, err
 }

+ 1 - 0
server/initialize/gorm.go

@@ -42,6 +42,7 @@ func RegisterTables() {
 		dao.SysBaseMenuParameter{},
 		dao.SysBaseMenuBtn{},
 		dao.SysAuthorityBtn{},
+		dao.Notice{},
 
 		example.ExaFile{},
 		example.ExaFileChunk{},

+ 1 - 0
server/initialize/router.go

@@ -85,6 +85,7 @@ func Routers() *gin.Engine {
 		systemRouter.InitSysOperationRecordRouter(PrivateGroup)  // 操作记录
 		systemRouter.InitSysDictionaryDetailRouter(PrivateGroup) // 字典详情管理
 		systemRouter.InitAuthorityBtnRouterRouter(PrivateGroup)  // 字典详情管理
+		systemRouter.InitNoticeRouter(PrivateGroup)              //通知
 
 		exampleRouter.InitFileUploadAndDownloadRouter(PrivateGroup)
 

+ 5 - 0
server/model/common/request/common.go

@@ -103,4 +103,9 @@ type CreateProcess struct {
 	ProcessNodes []dao.ProcessNodes `json:"processNodes" form:"processNodes"`
 }
 
+type OperateRecord struct {
+	ProjectProcess dao.ProjectProcess `json:"projectProcess" form:"projectProcess"`
+	Description    dao.Description    `json:"description" form:"description"`
+}
+
 type Empty struct{}

+ 25 - 0
server/router/system/Notice.go

@@ -0,0 +1,25 @@
+package system
+
+import (
+	"github.com/gin-gonic/gin"
+	v1 "server/api/v1"
+	"server/middleware"
+)
+
+type NoticeRouter struct{}
+
+func (s *NoticeRouter) InitNoticeRouter(Router *gin.RouterGroup) {
+	noticeRouter := Router.Group("notice").Use(middleware.OperationRecord())
+	noticeRouterWithoutRecord := Router.Group("notice")
+	noticeApi := v1.ApiGroupApp.SystemApiGroup.NoticeApi
+	{
+		noticeRouter.GET("readNotice", noticeApi.ReadNotice)
+		noticeRouter.POST("createNotice", noticeApi.CreateNotice)
+		noticeRouter.PUT("updateNotice", noticeApi.UpdateNotice)
+		noticeRouter.DELETE("deleteNotice", noticeApi.DeleteNotice)
+	}
+	{
+		noticeRouterWithoutRecord.GET("queryUserUnreadNotice", noticeApi.QueryUserUnreadNotice)
+		noticeRouterWithoutRecord.GET("queryAllNotices", noticeApi.QueryAllNotices)
+	}
+}

+ 1 - 0
server/router/system/enter.go

@@ -12,4 +12,5 @@ type RouterGroup struct {
 	OperationRecordRouter
 	DictionaryDetailRouter
 	AuthorityBtnRouter
+	NoticeRouter
 }

+ 1 - 0
server/router/workflow/description.go

@@ -17,6 +17,7 @@ func (s *DescriptionRouter) InitDescriptionRouter(Router *gin.RouterGroup) {
 		descriptionRouter.POST("createDescription", descriptionApi.CreateDescription)
 		descriptionRouter.PUT("updateDescription", descriptionApi.UpdateDescription)
 		descriptionRouter.DELETE("deleteDescription", descriptionApi.DeleteDescription)
+		descriptionRouter.POST("processOperate", descriptionApi.ProcessOperate)
 	}
 	{
 		descriptionRouterWithoutRecord.GET("queryDescriptionByProjectProcessId", descriptionApi.QueryDescriptionByProjectProcessId)

+ 1 - 1
server/router/workflow/projectProcess.go

@@ -20,7 +20,7 @@ func (s *ProjectProcessRouter) InitProjectProcessRouter(Router *gin.RouterGroup)
 	}
 	{
 		projectProcessRouterWithoutRecord.POST("queryProjectApplicantList", projectProcessApi.QueryProjectApplicantList)
-		projectProcessRouterWithoutRecord.GET("queryProjectProcessList", projectProcessApi.QueryProjectProcessList)
+		projectProcessRouterWithoutRecord.POST("queryProjectProcessList", projectProcessApi.QueryProjectProcessList)
 		projectProcessRouterWithoutRecord.GET("queryProjectProcessById", projectProcessApi.QueryProjectProcessById)
 	}
 }

+ 3 - 0
server/service/admin/project.go

@@ -201,6 +201,9 @@ func (ps *ProjectService) DeleteProject(code string) error {
 	if len(expenses) > 0 {
 		return fmt.Errorf("项目下存在费用记录")
 	}
+	if !project.IsApprove {
+		return fmt.Errorf("项目未审批完成")
+	}
 	return dao.DeleteProject(code)
 }
 

+ 1 - 0
server/service/system/enter.go

@@ -12,4 +12,5 @@ type ServiceGroup struct {
 	OperationRecordService
 	DictionaryDetailService
 	AuthorityBtnService
+	NoticeService
 }

+ 29 - 0
server/service/system/notice.go

@@ -0,0 +1,29 @@
+package system
+
+import "server/dao"
+
+type NoticeService struct{}
+
+func (ns *NoticeService) QueryUserUnreadNotice(userId int) ([]dao.Notice, error) {
+	return dao.QueryUserUnreadNotice(userId)
+}
+
+func (ns *NoticeService) QueryAllNotices() ([]dao.Notice, error) {
+	return dao.QueryAllNotices()
+}
+
+func (ns *NoticeService) CreateNotice(notice dao.Notice) error {
+	return notice.CreateNotice()
+}
+
+func (ns *NoticeService) ReadNotice(id int) error {
+	return dao.ReadNotice(id)
+}
+
+func (ns *NoticeService) UpdateNotice(notice dao.Notice) error {
+	return notice.UpdateNotice()
+}
+
+func (ns *NoticeService) DeleteNotice(notice dao.Notice) error {
+	return notice.DeleteNotice()
+}

+ 4 - 0
server/service/workflow/description.go

@@ -23,3 +23,7 @@ func (ds *DescriptionService) UpdateDescription(description dao.Description) err
 func (ds *DescriptionService) DeleteDescription(description dao.Description) error {
 	return description.DeleteDescription()
 }
+
+func (ds *DescriptionService) ProcessOperate(process dao.ProjectProcess, description dao.Description) error {
+	return dao.ProcessOperate(process, description)
+}