xu пре 7 месеци
родитељ
комит
b844ef9b05

+ 10 - 0
server/api/v1/admin/finance.go

@@ -147,6 +147,16 @@ func (fa *FinanceApi) QueryProjectFinance(c *gin.Context) {
 	response.OkWithData(finance, c)
 }
 
+func (fa *FinanceApi) QueryReserveBalance(c *gin.Context) {
+	balance, err := financeService.QueryReserveBalance()
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryReserveBalance ====== " + err.Error())
+		return
+	}
+	response.OkWithData(balance, c)
+}
+
 func (fa *FinanceApi) CreateDailyExpenses(c *gin.Context) {
 	var expenses dao.DailyExpenses
 	err := c.ShouldBindJSON(&expenses)

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

@@ -1,3 +1,79 @@
 package workflow
 
+import (
+	"github.com/gin-gonic/gin"
+	"server/dao"
+	"server/global"
+	"server/model/common/response"
+	"strconv"
+)
+
 type DescriptionApi struct{}
+
+func (da *DescriptionApi) QueryDescriptionByProjectProcessId(c *gin.Context) {
+	id := c.Query("projectProcessId")
+	projectProcessId, err := strconv.Atoi(id)
+	if err != nil {
+		response.FailWithMessage("参数错误", c)
+		global.GVA_LOG.Error("QueryDescriptionByProjectProcessId ====== " + err.Error())
+		return
+	}
+	description, err := descriptionService.QueryDescriptionByProjectProcessId(projectProcessId)
+	if err != nil {
+		response.FailWithMessage("查询失败", c)
+		global.GVA_LOG.Error("QueryDescriptionByProjectProcessId ====== " + err.Error())
+		return
+	}
+	response.OkWithData(description, c)
+}
+
+func (da *DescriptionApi) CreateDescription(c *gin.Context) {
+	var description dao.Description
+	err := c.ShouldBindJSON(&description)
+	if err != nil {
+		response.FailWithMessage("参数错误", c)
+		global.GVA_LOG.Error("CreateDescription ====== " + err.Error())
+		return
+	}
+	err = descriptionService.CreateDescription(description)
+	if err != nil {
+		response.FailWithMessage("创建失败", c)
+		global.GVA_LOG.Error("CreateDescription ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("创建成功", c)
+}
+
+func (da *DescriptionApi) UpdateDescription(c *gin.Context) {
+	var description dao.Description
+	err := c.ShouldBindJSON(&description)
+	if err != nil {
+		response.FailWithMessage("参数错误", c)
+		global.GVA_LOG.Error("UpdateDescription ====== " + err.Error())
+		return
+	}
+	err = descriptionService.UpdateDescription(description)
+	if err != nil {
+		response.FailWithMessage("更新失败", c)
+		global.GVA_LOG.Error("UpdateDescription ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("更新成功", c)
+}
+
+func (da *DescriptionApi) DeleteDescription(c *gin.Context) {
+	var description dao.Description
+	err := c.ShouldBindJSON(&description)
+	if err != nil {
+		response.FailWithMessage("参数错误", c)
+		global.GVA_LOG.Error("UpdateDescription ====== " + err.Error())
+		return
+	}
+	err = descriptionService.DeleteDescription(description)
+	if err != nil {
+		response.FailWithMessage("删除失败", c)
+		global.GVA_LOG.Error("DeleteDescription ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("删除成功", c)
+}

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

@@ -1,3 +1,106 @@
 package workflow
 
+import (
+	"github.com/gin-gonic/gin"
+	"server/dao"
+	"server/global"
+	"server/model/common/request"
+	"server/model/common/response"
+)
+
 type ProjectProcessApi struct{}
+
+func (ppa *ProjectProcessApi) QueryProjectApplicantList(c *gin.Context) {
+	var info request.SearchProjectProcess
+	err := c.ShouldBindJSON(&info)
+	if err != nil {
+		response.FailWithMessage("参数解析失败", c)
+		global.GVA_LOG.Error("QueryProjectApplicantList ====== " + err.Error())
+		return
+	}
+	list, total, err := projectProcessService.QueryProjectApplicantList(info)
+	if err != nil {
+		response.FailWithMessage("查询失败", c)
+		global.GVA_LOG.Error("QueryProjectApplicantList ====== " + err.Error())
+		return
+	}
+	response.OkWithDetailed(response.PageResult{
+		List:     list,
+		Total:    total,
+		Page:     info.PageInfo.Page,
+		PageSize: info.PageInfo.PageSize,
+	}, "获取成功", c)
+}
+
+func (ppa *ProjectProcessApi) QueryProjectProcessList(c *gin.Context) {
+	var info request.SearchProjectProcess
+	err := c.ShouldBindJSON(&info)
+	if err != nil {
+		response.FailWithMessage("参数解析失败", c)
+		global.GVA_LOG.Error("QueryProjectProgressList ====== " + err.Error())
+		return
+	}
+	list, total, err := projectProcessService.QueryProjectProcessList(info)
+	if err != nil {
+		response.FailWithMessage("查询失败", c)
+		global.GVA_LOG.Error("QueryProjectProgressList ====== " + err.Error())
+		return
+	}
+	response.OkWithDetailed(response.PageResult{
+		List:     list,
+		Total:    total,
+		Page:     info.PageInfo.Page,
+		PageSize: info.PageInfo.PageSize,
+	}, "获取成功", c)
+}
+
+func (ppa *ProjectProcessApi) CreateProjectProcess(c *gin.Context) {
+	var pp dao.ProjectProcess
+	err := c.ShouldBindJSON(&pp)
+	if err != nil {
+		response.FailWithMessage("参数解析失败", c)
+		global.GVA_LOG.Error("CreateProjectProgress ====== " + err.Error())
+		return
+	}
+	err = projectProcessService.CreateProjectProcess(pp)
+	if err != nil {
+		response.FailWithMessage("创建失败", c)
+		global.GVA_LOG.Error("CreateProjectProgress ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("创建成功", c)
+}
+
+func (ppa *ProjectProcessApi) UpdateProjectProcess(c *gin.Context) {
+	var pp dao.ProjectProcess
+	err := c.ShouldBindJSON(&pp)
+	if err != nil {
+		response.FailWithMessage("参数解析失败", c)
+		global.GVA_LOG.Error("UpdateProjectProgress ====== " + err.Error())
+		return
+	}
+	err = projectProcessService.UpdateProjectProcess(pp)
+	if err != nil {
+		response.FailWithMessage("更新失败", c)
+		global.GVA_LOG.Error("UpdateProjectProgress ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("更新成功", c)
+}
+
+func (ppa *ProjectProcessApi) DeleteProjectProcess(c *gin.Context) {
+	var pp dao.ProjectProcess
+	err := c.ShouldBindJSON(&pp)
+	if err != nil {
+		response.FailWithMessage("参数解析失败", c)
+		global.GVA_LOG.Error("DeleteProjectProgress ====== " + err.Error())
+		return
+	}
+	err = projectProcessService.DeleteProjectProcess(pp)
+	if err != nil {
+		response.FailWithMessage("删除失败", c)
+		global.GVA_LOG.Error("DeleteProjectProgress ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("删除成功", c)
+}

+ 1 - 0
server/dao/commodity.go

@@ -0,0 +1 @@
+package dao

+ 1 - 1
server/dao/expenses.go

@@ -112,7 +112,7 @@ func (e Expenses) CreateExpenses() error {
 }
 
 func (e Expenses) UpdateExpenses() error {
-	return global.GVA_DB.Model(&Expenses{}).Where("id = ?", e.ID).Updates(&e).Error
+	return global.GVA_DB.Model(&Expenses{}).Select("*").Omit("created_at").Where("id = ?", e.ID).Updates(&e).Error
 }
 
 func (e Expenses) DeleteExpenses() error {

+ 1 - 1
server/dao/node.go

@@ -6,7 +6,7 @@ type Node struct {
 	global.GVA_MODEL
 	NodeName        string     `json:"nodeName" form:"nodeName" gorm:"comment:审批节点名称"`
 	ApproverId      int        `json:"approverId" form:"approverId" gorm:"comment:审批人id"`
-	Approver        Approver   `json:"approver" form:"approver" gorm:"foreignKey:ApproverId;references:id;"`
+	Approver        SysUser    `json:"approver" form:"approver" gorm:"foreignKey:ApproverId;references:id;"`
 	NodeOrder       int        `json:"nodeOrder" form:"nodeOrder" gorm:"comment:节点顺序"`
 	NodeDescription string     `json:"nodeDescription" form:"nodeDescription" gorm:"comment:节点描述"`
 	Processes       []*Process `json:"processes" form:"processes" gorm:"many2many:process_nodes;"`

+ 6 - 1
server/dao/process.go

@@ -42,7 +42,12 @@ func (p Process) CreateProcess() error {
 }
 
 func (p Process) UpdateProcess() error {
-	err := global.GVA_DB.Where("id = ?", p.ID).Updates(&p).Error
+	// 清除现有的节点
+	err := global.GVA_DB.Model(&p).Association("Nodes").Clear()
+
+	// 添加新的节点
+	err = global.GVA_DB.Model(&p).Association("Nodes").Append(p.Nodes)
+	err = global.GVA_DB.Where("id = ?", p.ID).Updates(&p).Error
 	return err
 }
 

+ 30 - 2
server/dao/projectFee.go

@@ -1,6 +1,10 @@
 package dao
 
-import "server/global"
+import (
+	"github.com/shopspring/decimal"
+	"gorm.io/gorm"
+	"server/global"
+)
 
 type ProjectFee struct {
 	global.GVA_MODEL
@@ -59,12 +63,36 @@ func QueryProjectFeeByGenre(genre int) (projectFee []ProjectFee, err error) {
 	return projectFee, err
 }
 
+type Reserve struct {
+	ReserveAmount     float64 `json:"reserveAmount"`
+	ExpenditureAmount float64 `json:"expenditureAmount"`
+	Balance           float64 `json:"balance"`
+}
+
+func QueryReserveBalance() (reserve Reserve, err error) {
+	err = global.GVA_DB.Transaction(func(tx *gorm.DB) error {
+		txErr := tx.Model(&ProjectFee{}).Select("SUM(expenditure_amount) as expenditure_amount").Where("genre = ?", 7).First(&reserve).Error
+		if txErr != nil {
+			return txErr
+		}
+		txErr = tx.Model(&Expenses{}).Select("SUM(expenditure_amount) as reserve_amount").Where("genre = ?", 7).First(&reserve).Error
+		if txErr != nil {
+			return txErr
+		}
+		return txErr
+	})
+	// 使用decimal 防止精度不准
+	exponent := decimal.NewFromFloatWithExponent(reserve.ReserveAmount-reserve.ExpenditureAmount, -2)
+	reserve.Balance = exponent.InexactFloat64()
+	return reserve, err
+}
+
 func (e ProjectFee) CreateProjectFee() error {
 	return global.GVA_DB.Create(&e).Error
 }
 
 func (e ProjectFee) UpdateProjectFee() error {
-	return global.GVA_DB.Model(&ProjectFee{}).Where("id = ?", e.ID).Updates(&e).Error
+	return global.GVA_DB.Model(&ProjectFee{}).Select("*").Omit("created_at").Where("id = ?", e.ID).Updates(&e).Error
 }
 
 func (e ProjectFee) DeleteProjectFee() error {

+ 2 - 0
server/initialize/gorm.go

@@ -71,6 +71,8 @@ func RegisterTables() {
 		dao.Node{},
 		dao.Approver{},
 		dao.Process{},
+		dao.Description{},
+		dao.ProjectProcess{},
 	)
 	if err != nil {
 		global.GVA_LOG.Error("register table failed", zap.Error(err))

+ 4 - 0
server/initialize/router.go

@@ -96,6 +96,10 @@ func Routers() *gin.Engine {
 		adminRouter.InitExpensesRouter(PrivateGroup)
 
 		workflowRouter.InitApproverRouter(PrivateGroup)
+		workflowRouter.InitNodeRouter(PrivateGroup)
+		workflowRouter.InitProcessRouter(PrivateGroup)
+		workflowRouter.InitDescriptionRouter(PrivateGroup)
+		workflowRouter.InitProjectProcessRouter(PrivateGroup)
 	}
 
 	global.GVA_LOG.Info("router register success")

+ 1 - 0
server/router/admin/finance.go

@@ -39,5 +39,6 @@ func (s *ProjectRouter) InitFinanceRouter(Router *gin.RouterGroup) {
 		financeRouterWithoutRecord.GET("queryBorrowing", financeApi.QueryBorrowing)
 		financeRouterWithoutRecord.POST("queryDailyFileList", financeApi.QueryDailyFileList)
 		financeRouterWithoutRecord.GET("queryProjectFinance", financeApi.QueryProjectFinance)
+		financeRouterWithoutRecord.GET("queryReserveBalance", financeApi.QueryReserveBalance)
 	}
 }

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

@@ -0,0 +1,24 @@
+package workflow
+
+import (
+	"github.com/gin-gonic/gin"
+	v1 "server/api/v1"
+	"server/middleware"
+)
+
+type DescriptionRouter struct{}
+
+func (s *DescriptionRouter) InitDescriptionRouter(Router *gin.RouterGroup) {
+	descriptionRouter := Router.Group("description").Use(middleware.OperationRecord())
+	descriptionRouterWithoutRecord := Router.Group("description")
+
+	descriptionApi := v1.ApiGroupApp.WorkflowApiGroup.DescriptionApi
+	{
+		descriptionRouter.POST("createApprover", descriptionApi.CreateDescription)
+		descriptionRouter.PUT("updateApprover", descriptionApi.UpdateDescription)
+		descriptionRouter.DELETE("deleteApprover", descriptionApi.DeleteDescription)
+	}
+	{
+		descriptionRouterWithoutRecord.GET("queryDescriptionByProjectProcessId", descriptionApi.QueryDescriptionByProjectProcessId)
+	}
+}

+ 2 - 0
server/router/workflow/enter.go

@@ -4,4 +4,6 @@ type RouterGroup struct {
 	ApproverRouter
 	NodeRouter
 	ProcessRouter
+	ProjectProcessRouter
+	DescriptionRouter
 }

+ 25 - 0
server/router/workflow/projectProcess.go

@@ -0,0 +1,25 @@
+package workflow
+
+import (
+	"github.com/gin-gonic/gin"
+	v1 "server/api/v1"
+	"server/middleware"
+)
+
+type ProjectProcessRouter struct{}
+
+func (s *ProjectProcessRouter) InitProjectProcessRouter(Router *gin.RouterGroup) {
+	projectProcessRouter := Router.Group("projectProcess").Use(middleware.OperationRecord())
+	projectProcessRouterWithoutRecord := Router.Group("projectProcess")
+
+	projectProcessApi := v1.ApiGroupApp.WorkflowApiGroup.ProjectProcessApi
+	{
+		projectProcessRouter.POST("createApprover", projectProcessApi.CreateProjectProcess)
+		projectProcessRouter.PUT("updateApprover", projectProcessApi.UpdateProjectProcess)
+		projectProcessRouter.DELETE("deleteApprover", projectProcessApi.DeleteProjectProcess)
+	}
+	{
+		projectProcessRouterWithoutRecord.POST("queryProjectApplicantList", projectProcessApi.QueryProjectApplicantList)
+		projectProcessRouterWithoutRecord.GET("queryProjectProcessList", projectProcessApi.QueryProjectProcessList)
+	}
+}

+ 4 - 0
server/service/admin/finance.go

@@ -107,6 +107,10 @@ func (fs *FinanceService) QueryProjectFinance(code string) (dao.Project, error)
 	return project, err
 }
 
+func (fs *FinanceService) QueryReserveBalance() (dao.Reserve, error) {
+	return dao.QueryReserveBalance()
+}
+
 func (fs *FinanceService) CreateDailyExpenses(expenses dao.DailyExpenses) error {
 	return expenses.CreateDailyExpenses()
 }

+ 8 - 0
server/service/workflow/approver.go

@@ -25,6 +25,14 @@ func (as *ApproverService) CreateApprover(approver dao.Approver) error {
 }
 
 func (as *ApproverService) UpdateApprover(approver dao.Approver) error {
+	nodes, err := dao.QueryNodeByApproverId(int(approver.ID))
+	if err != nil {
+		return err
+	}
+	if len(nodes) > 0 {
+		return fmt.Errorf("该数据被使用过")
+	}
+
 	return approver.UpdateApprover()
 }
 

+ 7 - 0
server/service/workflow/node.go

@@ -32,6 +32,13 @@ func (ns *NodeService) CreateNode(node dao.Node) error {
 }
 
 func (ns *NodeService) UpdateNode(node dao.Node) error {
+	nodes, err := ns.QueryNodeByApproverId(int(node.ID))
+	if err != nil {
+		return err
+	}
+	if len(nodes) > 0 {
+		return fmt.Errorf("节点被使用过")
+	}
 	return node.UpdateNode()
 }